A
ist schon event-basiert:
Es sollen alle anstehenden Daten eingelesen werden,
und im Zweifel soll eine bestimmte Zeit lang darauf gewartet werden (hier: 10 Sekunden)
void myDialog::onSocketEvent(wxSocketEvent & Event)
{
wxSocketBase *sock = Event.GetSocket();
switch(Event.GetSocketEvent())
{
case wxSOCKET_INPUT:
{
// We disable input events, so that the test doesn't trigger
// wxSocketEvent again.
sock->SetNotify(wxSOCKET_LOST_FLAG);
sock->SetTimeout(2);
sock->SetFlags(wxSOCKET_NOWAIT);
wxString received;
char * buffer = new char[3];
while (sock->WaitForRead(10) == true)
{
sock->Read(buffer, 2);
wxUint32 bytes = sock->LastCount();
buffer[bytes] = '\0';
received.append(buffer);
}
delete[] buffer;
if (received.length() > 0)
{
wxMessageBox(received);
if (sock->WaitForWrite(5) == true)
{sock->Write(received.c_str(), received.length());}
else
{wxMessageBox("timeout; nix gesendet");}
}
else
{wxMessageBox("nix empfangen");}
// Enable input events again.
sock->SetNotify(wxSOCKET_LOST_FLAG | wxSOCKET_INPUT_FLAG);
}break;
case wxSOCKET_LOST:
{
//wxMessageBox("client lost");
m_numClients--;
sock->Destroy();
}break;
default:
{
}break;
}
}
Wie oben beschrieben, verursacht WaitForRead() volle CPU Last
alternativer case wxSOCKET_INPUT:
jetzt verursacht Read() die 100%ige Prozessorauslastung (bis der Timeout abgelaufen ist)
Das passiert immer dann, wenn Read() alles, was ansteht ausliest, d. h. wenn nach dem Read der "Eingabepuffer" leer ist, dann hängts
case wxSOCKET_INPUT:
{
// We disable input events, so that the test doesn't trigger
// wxSocketEvent again.
sock->SetNotify(wxSOCKET_LOST_FLAG);
sock->SetFlags(wxSOCKET_WAITALL);
sock->SetTimeout(10);
char * buffer = new char[11];
sock->Read(buffer, 10); ///// <-------------------- hier 100% CPU
wxUint32 bytes = sock->LastCount();
buffer[bytes] = '\0';
wxMessageBox(buffer);
if (sock->WaitForWrite(5) == true)
{sock->Write(buffer, bytes);}
else
{wxMessageBox("timeout; nix gesendet");}
delete[] buffer;
// Enable input events again.
sock->SetNotify(wxSOCKET_LOST_FLAG | wxSOCKET_INPUT_FLAG);
}