while schleife frage



  • ok, also den shortcut erkennt er jetzt, allerdings stoppt er immer noch wenn ich ins menü geh, ideen?



  • Havoc schrieb:

    @junix: tja, das kann ich dir leider auch nicht sagen 😉 , nur soviel: ich schreib mit dem borland c++ builder 6, vielleicht sagt das ja schon was

    Naja, nicht wirklich. Auch nicht jeder der mit MSVC arbeitet benutzt die MFC (o;

    Benutzt du irgendwelche Objekte die T-Irgendwas heissen?



  • @junix: ja, tu ich



  • Und wie kamst du zu obigem Code?



  • anderes forum 😉

    jetzt isser aber so:

    while (stop!=1)
    {
    Application->ProcessMessages();
    rechne();
    }



  • Du könntest deinen rechne()-Prozess auch in einen Thread auslagern. Siehe dazu Hilfe zu TThread.



  • hmm, ja, das hab ich auch schon aufgeschnappt, allerdings hab ich von threads leider gar keine ahnung, und die borland hilfe versteh ich dazu leider nicht wirklich... die meintest du doch oder?

    kann mir das vielleicht jemand konkret auf mein problem bezogen sagen wie das geht?



  • Gerade zu Threads ist die Hilfe sehr ausführlich

    Über Datei -> Neu-> Weitere eine Thread Unit mit in das Projekt aufnehmen. Den Code den der Thread erledigen soll im OnExecute reinsetzen.

    Dabei folgende Struktur nutzen:

    try
    	{
    	while(!Terminated)
    	{
    	//hier dein Code
             }
    	catch(...)
    	{
    
              .......
    	}
    

    Thread starten und stoppen steht in der Hilfe zu TThread





  • D:\Programm...

    kann nicht helfen



  • Jetzt Ok?



  • ich werds gleich mal ausprobieren 🙂



  • So, ich hab das jetzt mal ausprobiert, und es funktioniert nicht. 😃

    fragen:

    1. muss ich irgendwo einstellen, dass ich threads überhaupt nutzen kann, bei projekt->optionen vielleicht, ich dachte ich hab das irgendwo mal gelesen

    2. er startet mir meinen thread nicht, beziehungsweise ich kann gar nicht kompilieren. ich hab zum starten folgenden code:

    void __fastcall TSonnenSystem::Berechnungstarten1Click(TObject *Sender)
    {
     new TMyThread(false);
    }
    

    und zum beenden:

    void __fastcall TSonnenSystem::StopIt1Click(TObject *Sender)
    {
       TMyThread->Terminate();
    }
    

    Beide male sagt er mir, ein ; fehlt, Typname erwartet, und beim zweiten auch undefiniertes Symbol TMyThread (mein Thread heißt schon so 😉 )

    3. kann ich aus dem thread heraus eine funktion aus meiner unit1 aufrufen?
    ich hab mir das so gedacht:

    void __fastcall TMyThread::Execute()
    {
       while (!Terminated) TSonnenSystem->rechne();
    }
    

    4. ich hab außerdem noch außer meiner unit1 und jetzt durch den thread unit2 eine weitere name.cpp mit folgendem code, könnte das ein problem sein?

    #include <vcl.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    USEFORM("Unit1.cpp", SonnenSystem);
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     Application->Initialize();
                     Application->Title = "Titel";
                     Application->CreateForm(__classid(TSonnenSystem), &SonnenSystem);
                     Application->Run();
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
            catch (...)
            {
                     try
                     {
                             throw Exception("");
                     }
                     catch (Exception &exception)
                     {
                             Application->ShowException(&exception);
                     }
            }
            return 0;
    }
    

    lädt der mir hier meinen thread wohl gar nicht? was müsste ich denn reinschreiben, dass ers tut? oder muss ich den bei meiner unit1 irgendwo initialisieren?

    hmm, das wars erstmal, danke schonmal an alle!



  • Hättest nach dem 3. mal Bearbeiten ruhig auch die Code-Tags verwenden können.

    1.) Du solltest schon eine komplette Instanz deines Threads erstellen und die einem Zeiger zuweisen. Dann kannst du über den auch Terminate() aufrufen.

    2.) TSonnenSystem ist doch der Name der Klasse und nicht der Instanz, oder?



  • TSonnenSystem ist wohl das, was standardmäßig TForm1 ist.

    wie geht denn das mit der instanz und dem zeiger? sorry, aber blick leider echt nicht durch...



  • Hallo,

    Eine Instanz von TMyThread erzeugt man so

    TMyThread *mythread = new TMyThread(false);
    

    Vielleicht solltest du dir noch ein paar Grundlagen zu Typen, Zeigern sowie Klassen durchlesen. Oben auf der Forumseite ist ein Link zu entsprechenden Tutorials.



  • danke!
    ja, werd ich machen

    jetzt aber doch noch kurz: wo kommt die instanz hin? der meckert bei mir immer.



  • 1. Wenn dein Compiler meckert, sag uns auch was (Fehlermeldung)
    2. Die Instanz von TMyThread könnte z.Bsp. eine Membervariable deiner Form sein, oder global



  • global würde also heißen in eine der headerdateien, aber in welche und wo da?
    in unit1 (ursprüngliche) oder unit2 (thread)? wenn ich nämlich in die unit2.h unter public reinschreib, schluckt er das zwar, sagt mir aber immer noch "undefiniertes Symbol" beim aufruf von TMyThread->Resume();



  • Wie schon gesagt, du solltest dir erst einmal die Grundlagen aneignen.

    TMyThread->Resume();
    

    kann ja nicht funktionieren, da TMyThread ein Typ und keine Instanz ist. Wenn eine Variable mythread vom Typ TMyThread public member von TForm1 wäre würde der Aufruf z.Bsp. so aussehen

    Form1->mythread->Resume();
    

    Das sind aber, wie schon betont, absolute C++ Grundlagen.


Anmelden zum Antworten