Announcement

Collapse
No announcement yet.

[MFC] - Thread und EditFeld - Weiss nicht mehr weiter?!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [MFC] - Thread und EditFeld - Weiss nicht mehr weiter?!

    Hallo Zusammen

    Ich habe folgendes vor:
    Ich habe zwei Text, respektive Editfelder in einem Dialog. jeweils mit einer Member-Variable zugewiesen.

    Ich möchte, wenn das Programm läuft, automatisch (alle Minuten, oder sekunden) aus dem Internet die Warnungen auslesen und im Editfeld anzeigen lassen.

    Ich hab mir dazu einen Thread (oder zwei, einer für EditfeldSMS und einer für EditfeldWarnText) gebastelt, der mir das machen soll. Eigentlich klappt alles ganz gut, nur das Problem: die IF und ELSE ANweisung werden ignoiert! Anstatt das Feld zu leeren und neu zu aktualisieren, hängt der immer wieder das Alte daran, sodass es einen Endlosschwanz gibt! Fragt mich nicht wieso... ich kanns nicht ändern... hier starte ich den Thread (in OnIniitDialog, er sollte ja automatisch starten):

    Code:
      //Timer / Thread starten
    	LPVOID pParam = &m_ctlEditSCMT;
    	LPVOID pParam2 = &m_ctlEditSMS;
        ::AfxBeginThread(WarnList,pParam);
    	::AfxBeginThread(WarnSMSList,pParam2);
    Hier die beiden Threads:

    Code:
    UINT CHauptDlg::WarnList(LPVOID pParam)
    {
    	//Aktuelle Warnungen laden und im Editfeld anzeigen  
    	
    	 CString somecode, s;      
         CInternetSession session("Verbindungstest",1,INTERNET_OPEN_TYPE_PRECONFIG);
    
         CStdioFile* pFile = NULL;   
    	 CString strUrl("http://www.nfws.ch/inc/warnlist_scmt.php");
     do //Schleife starten für Thread
    {
    
       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);  
       }
    
       CEdit *pEdit = (CEdit*)pParam; 
    	
       CString result;
       pEdit->GetWindowTextA(result);
    
       if(result == "Warnungen werden geladen...")
       {
       s.Delete(0,1);
       s.Replace(_T("\\r\\n"), _T("\r\n"));
       pEdit->SetWindowTextA(s);
       }
    
       else if(result == s)
       {
       //Nichts machen
       }
       
       else
       {
       pEdit->Clear();
       s.Delete(0,1);
       s.Replace(_T("\\r\\n"), _T("\r\n"));
       pEdit->SetWindowTextA(s);
       }
    }while(1+1); //Weiss nicht welche sinnvolle variante hier geeignet ist um den Thread lebenslang am laufen zu halten bis das Programm beendet wird
    
    return 0;
    }
    
    UINT CHauptDlg::WarnSMSList (LPVOID pParam2)
    {
    	//Aktuelle Warnungen laden und im Editfeld anzeigen  
    	
    	 CString somecode, s;      
         CInternetSession session("Verbindungstest",1,INTERNET_OPEN_TYPE_PRECONFIG);
    
         CStdioFile* pFile = NULL;   
    	 CString strUrl("http://www.nfws.ch/inc/warnlist.php");
    
    do //Schleife starten für Thread
    {
    
       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);  
       }
    
       CEdit *pEdit2 = (CEdit*)pParam2; 
    	
       CString result;
       pEdit2->GetWindowTextA(result);
    
       if(result == "Warnungen werden geladen...")
       {
       s.Delete(0,1);
       s.Replace(_T("\\r\\n"), _T("\r\n"));
       pEdit2->SetWindowTextA(s);
       }
    
       else if(result == s)
       {
       //Nichts machen
       }
       
       else
       {
       pEdit2->Clear();
       s.Delete(0,1);
       s.Replace(_T("\\r\\n"), _T("\r\n"));
       pEdit2->SetWindowTextA(s);
       }
    }while(1+1); //Weiss nicht welche sinnvolle variante hier geeignet ist um den Thread lebenslang am laufen zu halten bis das Programm beendet wird
    return 0;
    }
    Das Projekt/EXE-Datei gibts hier zum Download (um zu testen, das Problem anzusehen welches ich meine): http://www.nfws.ch/SCMT.zip

    Vielen Dank für Eure Tips/Hilfe

    Grüsse aus der Schweiz
    Dominic / Wolf85

  • #2
    Windows-Controls (bzw. die zugrundeliegenden Fenster-Handle) haben ein Thread-Affinität. Man darf nur aus dem erzeugenden Thread darauf zugreifen.

    Und Delphi/C++Builder würde ein Synchronise aufruf genügen um die Zugriff zu synchronisieren. Etwas ähnliches sollte auch unte MFC verfügbar sein.

    Comment


    • #3
      Windows Controls?
      Gibts da irgendwo Beispiele für ? Befasste mich damit bisher noch nicht.

      lg
      Wolf

      Comment


      • #4
        Originally posted by Wolf85 View Post
        Windows Controls?
        Dein CEdit ist ein Windows Control (bzw. der Wrapper um das Control):
        Originally posted by Wolf85 View Post
        Gibts da irgendwo Beispiele für ? Befasste mich damit bisher noch nicht.
        Wird schon geben. Aber glücklicherweise muss ich mich seit fast 10 Jahren nicht mehr mit MFC herum ärgern.

        Aber google mal nach "MFC Thread Control". Ich glaube da findest du einige Beispiele

        Comment


        • #5
          Hallo

          Danke für den Anstoss. Ich weiss wie es ist sich 10 Jahre nicht mehr damit zu befassen. :-)

          Wenn ich nach MFC Thread Control suche, komme ich die Suchergebnisse die ich vorher auch schon hatte. Und alles handelt sich um Buttons mit ThreadStart, ThreadStopp etc, aber genau das suche ich nicht.

          Der Thread sollte bei Dialogaufruf automatisch zu laufen beginnen und erst wieder enden, wenn der Dialog geschlossen wird.

          lg
          Wolf

          Comment

          Working...
          X