recv() und ReadFile() in Extra-Thread, wie?
-
Tag,
ich habe grade zwei Projekte beim einen muss ich dauernd
abfrage ob ich mit recv etwas empfangen kann und beim anderen
mit ReadFile (geht um ne rs232 Schnittstelle).
Wie ich einen neuen Thread aufmache ist mir klar,
die Frage ist nur, wie arbeite ich in dem
Thread mit meinem socket / file-Handle ?
Geb ich das als Referenz oder Zeiger rein?
Oder doch ganz anders?Danke schonmal,
Max
-
Zeig doch mal Code, dann lässt sich einfacher diskutieren.
Simon
-
Ok, momentan habe ich diesen Code hier
in meinem Main-Thread:NetworkServer* ns; ns = new NetworkServer; vector<string> msgs;while(1) { msgs = ns->waitForMessages(); if(ns->getLastError() != 0) { msgs.push_back("an Error appeared: " + valueToString(ns->getLastError())); delete ns; break; } for(int i=0; i<msgs.size(); i++) { log->Items->Add(msgs[i].c_str()); } Application->ProcessMessages(); }den will ich jetzt in dieser Form in einen Thread auslagern:
while(1) { msgs = ns->waitForMessages(); if(ns->getLastError() != 0) { Synchronize(...); // dem Main Thread die Error Nummer mitgeben } for(int i=0; i<msgs.size(); i++) { Synchronize(...); // dem Main Thread die Nachrichten übermitteln } Application->ProcessMessages(); }ns ist eine Instanz meiner Klasse die das alles handelt, sie
beinhaltet die Sockets etc...
Die Frage ist, wie rufe ich Methoden dieser Klasse im Thread auf,
also, übergebe ich die Instanz an den Thread oder muss ich alle Sockets
im Thread nochmal neu aufmachen oder wie oder was.Gruß,
Max
-
Übergib den NetworkServer an den Thread.
Alternativ kannst Du auch den NetworkServer auch erst im Thread erstellen.Dann musst Du dir überlegen, wie die Daten aus dem "Receiver" Thread wieder in den Main Thread kommen. Eine Möglichkeit wäre eine Queue, oder via Windows Messages. Beachte dass die Zugriffe auf Speicher (Variablen) der von beiden Threads gemeinsam genutzt wird synchronisiert werden müssen (mit Critical Sections o.ä.).
Achtung: Du darfst nur aus dem Thread auf UI Elemente zugreifen, der sie erstellt hat.
-
simon.gysi schrieb:
Übergib den NetworkServer an den Thread.
Alternativ kannst Du auch den NetworkServer auch erst im Thread erstellen.Dann musst Du dir überlegen, wie die Daten aus dem "Receiver" Thread wieder in den Main Thread kommen. Eine Möglichkeit wäre eine Queue, oder via Windows Messages. Beachte dass die Zugriffe auf Speicher (Variablen) der von beiden Threads gemeinsam genutzt wird synchronisiert werden müssen (mit Critical Sections o.ä.).
Achtung: Du darfst nur aus dem Thread auf UI Elemente zugreifen, der sie erstellt hat.
Danke erstmal, hat schonmal sehr geholfen

Also den NetworkServer will ich nicht erst im Thread erstellen da ich
vom Main-Thread aus Daten verschicken will.Also, hätte ich vlt dazu sagen sollen, ich benutze den Borland, habs hier nur
in der WinAPI da es ja um WinAPI Funktionen (recv() und ReadFile()) geht
und mit dem Borland darf ich auch auf UI Elemente greifen die ich nicht
erstellt habe. Auch wenn ich das garnicht will, ich dachte eigentlich
das ich einen vektor mit den Nachrichten rausgebe (jedes mal wenn eben
was empfangen wurde).Ok, funktioniert alles

Wenns jemand interessiert ich machs jetzt so:
Thread:
//--------------------------------------------------------------------------- void __fastcall receiver::Execute() { while(1) { msgs.clear(); msgs = ns->waitForMessages(); if(ns->getLastError() != 0) { msgs.push_back("an Error occured: " + valueToString(ns->getLastError())); Synchronize(&updateMessages); Suspend(); break; } Sleep(100); Synchronize(&updateMessages); } } //--------------------------------------------------------------------------- void __fastcall receiver::updateMessages() { Form1->msgs.clear(); Form1->msgs = msgs; } //---------------------------------------------------------------------------mit Synchronize werden die Empfangenen Daten in einen Vektor in meinem
Haupt-Thread geschrieben, dort gebe ich sie dann mit einem Timer aus://--------------------------------------------------------------------------- void __fastcall TForm1::msgTimerTimer(TObject *Sender) { for(int i=0; i<msgs.size(); i++) { log->Items->Add(msgs[i].c_str()); } msgs.clear(); } //---------------------------------------------------------------------------