B
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();
}
//---------------------------------------------------------------------------