Timer/Thread/Static - Problemchen
-
Hallo Zusammen
Ich habe im Dialog ein Textfeld IDC_STATICWARN mit der Variable m_ctlStaticWarn (Control-Variable).
Mit Hilfe eines Threads möchte ich über das Internet laufend die Warnungen mittels PHP-Datei auslesen und diese dann im Textfeld anzeigen lassen. Wenn die Warnung geändert wird, sollte dies entsprechend auch im Textfeld geschehen.
Ich löse es zur Zeit so, dass ich im Thread ein Sleep(1000); setze und anschliessend nochmals der Textfeld-Inhalt mit pStatic->SetWindowText(""); auf null setze. Anschliessend wieder ein Sleep(1000); damit der Timer eine Sekunde wartet und danach erneut den Warnsattus prüft und anzeigt.
Leider geht das nicht so wie ich möchte!! Zwar wird die Warnung angezeigt, das gesamte Textfeld gelöscht, ABER dann wird der warntext einfach hinter den ersten drangehängt... das heisst ,jede Sekunde steht wieder ein weitere Text, statt alle gelöscht und nur EINER stehen würde.
Beispiel:
Testwarnung (sollte bleiben bis es geändert wurde).Mein Programm macht aber:
Testwarnung
Nach 1 Sekunde:
Testwarnung Testwarnung
Nach 2 Sekunden
Testwarnung Testwarnung Testwarnung ...
aber genau das möchte ich nicht. Wo ist hier was faul??? Ich komme einfach nicht dahinter.. hier mal der Code:
Der Timer wird gestartet (der Parameter für CSTRING StaticText wird mitübergeben):
//Timer / Thread starten LPVOID pParam = &m_ctlStaticWarn; ::AfxBeginThread(WarnList,pParam);
Hier der Thread:
UINT CHauptDlg::WarnList(LPVOID pParam) { //Aktuelle Warnungen laden und im Editfeld anzeigen CString somecode, s; CInternetSession session("Warnlist",1,INTERNET_OPEN_TYPE_PRECONFIG); CStdioFile* pFile = NULL; CString strUrl("http://www.nfws.ch/inc/warnlist.php"); do { try { pFile = session.OpenURL(strUrl,1,INTERNET_FLAG_TRANSFER_BINARY,NULL,0); if(pFile) { while (pFile->ReadString(somecode) != NULL) { s = s + somecode; } pFile->Close(); } } catch (CInternetException* e) { e->Delete(); session.Close(); CloseHandle(session); } CStatic *pStatic = (CStatic*)pParam; pStatic->SetWindowTextA(s); //Hier wird die Warnung ans Textfeld übergeben Sleep(1000); pStatic->SetWindowTextA(""); //Hier sollte das Feld wieder gelöscht werden Sleep(1000); //Eine Sekunde warten bevor erneut die warnung überprüft und übergeben wird, allerdings schlägt das leider Fehl, also nicht fehl, sondern es wird wie gesagt die erneute Überprüfung und der Text an den ersten angehängt... }while(1+1); return 0; }
Den Thread starte ich in "OnInitDialog" weil der automatisch starten und endlos laufen sollte !
Hat jemand eine Lösung eine Antwort??LG aus der Schweiz
Greetz Wolf und danke schon zum Voraus
-
Witzbold! Und das soll an SetWindowTetx liegen?
Schau Dir mal Deine Schleife an. Du sammelst Daten im Sring s und zeigst die an.
Und was machst Du danach?
Du löscht nicht etwa s, nein Du sammelst weiter Daten in s im nächsten Schleifendurchlauf.
Und was heißt das?Ich spare mir die Antwort!
Tipp: Beschäftige Dich mal mit dem Scope von Variablen.