PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Builder 5 + Threads + Objekte



lion1984
29.08.2006, 19:48
Hallo liebes Forum,

ich versuche gerade meine ersten Schritte in Threads, klappt alles ganz gut (zB 2,3 Zähler laufen lassen). Nur meine Frage ist, kann ich in diesem Thread auch Objekte erzeugen ? zB. eine Listbox? und kann ich dann im Hauptformular auf dieses Zugreifen?

zB im Thread nen Edit Feld mit "hallo + Zählervariable".
Der thread wird gestartet und es beginnt im thread mit "Hallo1, Hallo2,usw"
Und in der Hauptform soll dann zB bei Knofpdruck der Text dieses Editfeldes geholt zu werden und zB wo anders angezeigt oder verarbeitet werden?

das is das was ich glaube zu wissen:

Definition in der Thread Klasse:


__published:
TEdit *Edit1;

Damit ich extern zugreifen kann am ende:

extern PACKAGE TThread1 *TThread_1;

so, im execute kann ich dann normal zugreifen: EDit1->Text="Hallo";
und im Hauptformular siehts dann so aus:


TThread1 *temp;
//zugriff??
temp->Edit1->Text ??


hoffe ich habe mich gut ausgedrückt und hoffe die frage is nicht all zu blöd.
Bei der suche nach Threads habe ich immer starten und beenden gefunden, dass klappt ja

lg

ogni42
30.08.2006, 08:10
In einem Thread läuft exakt die Funktion, die Du bei der Erzeugung des Threads angegeben hast. Alles was innerhalb dieser Funktion passiert (andere Funktionen aufrufen, Objekte erzeugen/löschen, ...) läuft im selben Threadrahmen.

Wenn Thread B auf erzeugte Objekte von Thread A zugreifen will müssen die zumindest die Adressen der Objekte kennen. Wenn Thread A Methoden eines Objektes aufruft, das in Thread B erzeugt wurde, laufen die Methoden dennoch im Rahmen von Thread A.

Ich hoffe, das war einigermaßen verständlich erklärt.

vajk
30.08.2006, 09:05
Also ich würde im Hauptprogramm die Listboxen anlegen und über den globalen Form-Pointer im Thread die Listbox füllen ...
Ein Thread ist unabhängig von den Forms und dient z.B. für die Abarbeitung der seriellen Schnittstelle o.ä. Vorteil ist, er läuft quasi parallel, eine Delay-Funktion innerhalb des Threads behindert nicht das Hauptprogramm. Die Delayfunktion innerhalb der Loop des Threads ist ein muß !!! Sonst bekommt der Thread 99% Programmlaufzeit und wirkt behindernd !!!

Dein Beispiel zeigt mir noch nicht, wofür Du Threads nutzen willst, zur normalen Interaktion mit dem User ist dies m.E. nicht nötig.

Zur Info- ich nutze Borland Builder 5 schon lange kommerziell für meine Kundensoftware. Threads nutze ich wie oben erläutert nur, um mit Hardware via Serielle zu Kommunizieren.

Viel Erfolg,
Vajk

lion1984
30.08.2006, 09:25
Zur Info- ich nutze Borland Builder 5 schon lange kommerziell für meine Kundensoftware. Threads nutze ich wie oben erläutert nur, um mit Hardware via Serielle zu Kommunizieren.


genau das will ich.. ich will ne hauptfrom (grafisch meist) und nebenbei eben die Schnittstelle auf Daueraktivität (eben wie es mein Protokoll benötigt).

ich hab es geschaft in der Hauptform die Listbox zu füllen, daher mal die frage, giibts es einen event dafür, wenn ein item hinzugefügt ist?

Bis jetzt habe ich ne listbox, die per timer alle zB 1 sek abgearbetit wird, jedoch bekamm ich die items selbst heraus.. nur gesamtter text (Item 1||Item2 bla bla).

und wie gesagt, genau dafür brauch ich dne thread..
lg

Babbage
30.08.2006, 09:28
Die VCL von Borland nicht Threadfest.
Also am besten aufpassen und solche Objekte nur im Hauptthread bearbeiten.
Das heißt nicht das es nicht gutgehen kann, nur gibts keine Garanite das es immer klappt.

Babbage

vajk
30.08.2006, 11:56
nein, es gibt kein Event, daß die Listbox gefüllt wurde - weil das (Haupt-)Programm sie (sein Kind) ja selbst füllt. Dein Event kannst Du Dir jedoch im Fall der Füllung locker selbst erzeugen :-) Die gute alte WM_MESSAGE :-)

Du könntest jedoch einfach die ListBox->Count periodisch abfragen ... ich würde jedoch eine Hauptfunktion aufrufen ...