Thread problem



  • Hallo,

    ich habe das mit der classe kemacht

    class threadtest : public CWinThread
    {
    public:
    	void funk(COberflche_alkDlg* gt,int anz,char* arr[],CString m_INI,CString init)
    	{
    		CALKPostProcessor geoTools;
    		if (geoTools.startProcessing(gt,m_INI,anz,arr))
    			WritePrivateProfileString ("Erledigt", "erst", "1", init);
    	}
    };
    

    der aufruf

    threadtest test;
    test.funk(this,16,arr,m_INI,init);
    

    aber das programm macht dan tozdem nichts anderes (es zeichnet sich nicht neu, es nimt kein anderen befel an)

    das muss doch irgendwie funktioniren???? 😕 😕

    MFG TaccoGo



  • also ich verstehe nicht so ganz was du vorhast .. dein fkt im thread soll was neu berechnen und solbald es fertig ist (?) diese berechnungen einfliessen lassen in deine gui ?
    irgendwie ist die fkt ja unabhägig von der gui ..
    und falls die threads nebenläufig arbeiten , muss der main thread ja wissen wann die fkt aus dem anderen thrread fertig ist.. (synchronisation)
    aber zum zeichnen der gui ist doch letztlich der main thread zuständig .. also UpdateData(TRUE oder FALSE).. und sowas wie paint()...



  • die funktion berechnet aber das haubtprogramm niemt nichts mehr an (kein button den ich klicke oder sowas) werend der thread leuft.

    MFG TaccoGo



  • mal ne frage , wieoft soll denn deine fkt aus dem zusätzlichem thread aufgerufen werden ? ausserdem muss du dich vergewissern , wenn es nebenläufig abläuft , wann deine fkt im thread fertig ist . erst dann kannst du dein ergebnis verwenden ...



  • also habe ich mit den threads was nicht ferstanden oder wie?
    ich dachte ein thread leuft eigenständeg paralel zm haupt program.

    die daten die die funktion berechnet werden in dateien geschribrn und nicht in der gui benutzt.

    ich möchte nur das das haubtprogramm werter leuft werend die funktian arbeited.

    MFG TaccoGo



  • mal ne gegenfrage . wie soll auf einer einprozessor-pc-kiste zwei sachen gleichzeitg laufen ? (Taktflanken kommen und gehen) also rein zeitlich betrachtet ist es falsch zu sagen sie laufen nebenläufig . es ist aber ne frage der zeitzuteilung für die einzelnen Prozesse wenn ein prozess ne zeiteinteilung von sgane wir mal 50 ms gekommt und dieser nach 10ms fertig ist , wäre es ja dumm nicht woanders weiterzurechnen .. somit sieht es für den betrachter aus als laufen sie nebenläufig ..



  • ich wies das das nichtwirklich gleichzeitig leuft.(aber der rechner an den ich hir sitze hat 2 prozessuren)

    aber ich habe mal das probirt:

    void COberflche_alkDlg::DoEvents()   // Evtl. Anstehende Events ausführen 
    { 
        MSG msg; // Message Variable 
        // Process existing messages in the application's message queue. 
        // When the queue is empty, do clean up and return. 
        while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {    // Solange Messages vorhanden 
    
            if (!AfxGetThread()->PumpMessage()) return; // Kein plan...  :-) 
    	} 
    }
    

    die metode rufe ich ab und zu in fer fungtion auf dan leuft beides.

    aber damit habe ich ein anderes problem.

    MFG TaccoGo



  • hy ,
    wie ermittelst du ,dass die beiden threads nebenläufig laufen ..
    (guckst du dir die akt laufen thread in der threadliste an ?)



  • nun die funktion gibt abundzu status meldungen an die gui und die habtfunktion leuft da ich damit arbeiten kann.

    MFG TaccoGo



  • hy ,
    habe gerade nachmal ein wenig gelesen und mich über arbeits- und benutzeroberflächen -thread schlau gemacht:

    wenn du nur ne funktion als nebenläufig brauchst muss es so aussehen ..

    //muss vom typ UINT sein und globale fkt
    UINT ThreadFkt(LPVOID pParam)
    {
       ..deine funktionlität  
      return 0;
    } 
    
    Aufruf durch CWinThread *cwt= AfxBeginThread(ThreadFkt , GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
    

    was mir gerade noch aufgefallen ist .. du hast ja nur ein object angelegt
    hättest es aber mit AfxBeginThread(..) aufrufen müssen..



  • Achja ist noch keine synchronisation drin .. darauf muss natürlich noch geachet werden..
    nützliche stichwörter weiterhin ..
    SuspendThread //anhalten des threads
    ResumeThread // weiterführen des threads
    volatile beliebigeVaribable // variable wird nicht ins register geladen

    ::PostMessage( (HWND)pParam , WM_THREADFINISHED,0,0); //signalisiert beendeten thread ..


Anmelden zum Antworten