Vlakna v Delphi (poradite uplnemu začatečnikovi)
Zdravím.
Včera jsem poprve začal s vlakny a zkoušim.
Thread vytvařim přes New Items - ThreadObject
Jak přečtu s vlakna informace třeba s Form1 s komponenty edit
Toto nefunguje.
procedure vlakno.Execute;
var a:string;
begin
a := Form1.edit1.text;
end;
Začni nejprve psaním S a Z. V tomto příkladu vidím absolutní prdlajs. BTW proměnná a zmizí po opuštění procedury, tedy hned po naplnění (Delphi nehlásí upozornění při překladu?).
No.
Vytvořím novy projekt, do form1 vložím edit
Vytvářím Thread přes New Items – ThreadObject
Do Form1 – uses přidám Unit2 což je Thread.
A do Threadu
Vyhodí to
[DCC Error] Unit2.pas(23): E2003 Undeclared identifier: 'Form1'
Prostě někde dělám chybu a vlákno nevidí Form1
PS:Za tu hrubku se omlouvám,ještě před 10 lety jsem netušil že skončím tady,mama se vdala a já musel jít.
Tak doufam že prominete
Vzhladom na chybovu hlasku Undeclared identifier: 'Form1' by som povedal ze v tom unit2.pas musis na zaciatku deklarovat co to je Form1, t.j. nejak tam zadat ze Unit2 pouziva Form1 (t.j. ne Do Form1 – uses přidám Unit2, ale zrejme to treba deklarovat naopak)
S delphi nerobim len ti interpretujem tu hlasku :)
Treba pridať Unit, kde sa nachádza Form1 - u Teba zrejme Unit1... Pochopiteľne ,ak chceš odkazovať na nejakú triedu, objekt, premennú atď, ktorá sa nachádza inde
než je unit v ktorom odkazuješ...
No když odeberu s toho Form1(Unit1) s uses Unit2 a přidám do vlákna(Unit2) ,jak poradil pme, tak to funguje a mužů s vlákna přistupovat do Form1.
Když nechám ve Form1(Unit1) v uses Unit2 a ve vláknu(Unit2)bude v uses Unit1
tak mi delphi vyhodí [DCC Fatal Error] Unit1.pas(7): F2046 Out of memory.
Když s Form1(Unit1)odeberu Unit2 tak zas Form1 nevidí vlákno a tudíž ho s Form1 nemohu spouštět.
Nějak to mam poplantane
Prostě potřebuji Form1 (Unit1), kde je button a edit.
Při kliknuti na button vytvořím a spustím vlákno, které je v Unit2 a je v něm kód co jsem tu už dával 2X
Pomužete prosím.
daj sem kompletny program (taky stav ktory sa da prelozit) a napis ze co nefunguje
P.S. nemusis uplne kompletny ale vsetky deklaracie a ten pristup ze jak robis alebo c oti nejde
Takže chceš z Unit1 používať Unit2 (kvôli spusteniu vlákna) a z Unit2 chceš používať Unit1 (kvôli prečítaniu hodnoty z TEdit). Z toho ti vznikne kruhová referencia medzi unitmi, čo ti kompilátor nedovolí.
Preto to musíš vymyslieť tak, aby to nebolo takto vzájomne závislé. Resp. mohol by si to dať do jednej unity a použiť forward deklaráciu, ale to by bolo zbytočne neprehľadné.
ThreadObject je objekt, ktorý vytváraš vo Form1. Takže najjednoduchšie bude, keď pri inštancovaní objektu pošleš do konštruktora hodnotu z toho TEditu, napr. vlakno.Create(Form1.edit.text, CreateSuspended). V konštruktore thread objectu si ju zapamätáš v členskej premennej a následne ju použiješ vo vlakno.Execute.
Samozrejme, že dovolí...
Aha, áno, keď to dá do implementation, tak mu to dovolí.
Edit: Ale aj tak bude lepšie to oddeliť, inak tam bude zbytočná závislosť.
Pro MM: Není kompletní program, jen se učím a zkouším
Pro los: píšete ‘’’ mohol by si to dať do jednej unity’
Vlákna, které jsou v jedné unit jsem zvládl, i vlákna ve funkci.
Rad bych i toto vyřešil a uměl.
Nevím jak u Vás ale tady venku chčije.
Neměl by někdo čas udělat nějaký malý přiklad.
Form (Unit1), kde bude button a třeba edit.
Při kliknuti na button by se spustilo vlákno, které je v Unit1 a třeba zapsalo něco do toho editu.
Pro profika bych řek brnkačka na par minut, ne.