Thread problem



  • Hallo,

    zu den link hier

    [msdn]http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_multithreading.3a_.creating_worker_threads.asp[/msdn]

    die funktion AfxBeginThread() hat diese parameter nicht die in den Bes. angegeben werden. -> der kompeilen bringt da den fehler

    error C2665: 'AfxBeginThread' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden

    was mache ich den falsch?? 😕

    MFG TaccoGo



  • Hy ,

    wie sieht denn dein 1.Parameter aus , den du übergibst ?..

    laut msdn:
    CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

    CWinThread* AfxBeginThread( CRuntimeClass pThreadClass*, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );



  • der 1.parameter ist wie im Bes. der name der funktion.

    die anderen auf rufe kenne ich auch aus der MSDN aber in den Beispiel ist das anders.

    MFG TaccoGo



  • Hy ,
    mal ne frage , was macht denn das Makro AFX_THREADPROC ?(hab ich nirgends gefunden..)
    Was willst du erreichen? Nur eine fkt synchron.?

    aber versuch es doch nach der 2 Variante ..
    erstell ne klasse , ableiten von CWinThread , sollte doch auch funzen ..

    zum synchron. hilft vllt. auch das hier.
    http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_multithreading.3a_.how_to_use_the_synchronization_classes.asp



  • Hallo,

    ich möcht eine funktion die daten berechnet starten.
    aber das hauptprogramm sol weiter arbeiten.
    also einen thread starten.
    da ich das nochnie gemacht habe hab ich das in der MSDN gefunden.

    das mit der 2.Variante wie get das??

    MFG TaccoGo



  • hy,

    da ich jetzt selbst nicht ausprobiert habe kann ich kein 100%ige sicheheit geben ,dass es funzt.
    aber laut msdn:

    pThreadClass
    The RUNTIME_CLASS of an object derived from CWinThread.

    -> also baue ein klasse , in der deine methode aufegrufen werden soll, die von CWinThread abgeleitet wird.

    dann einfach ein aufruf , so wie du ihn schon machen würdest ..



  • danke ich probire das kleich.

    MFG TaccoGo



  • naja das klapt zwar aber mein programm macht dan trotzdem nichts anderes mehr????

    MFG TaccoGo



  • 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