[wxWidgets] Threads bzw. wxThread



  • wenn du nur wissen willst wie man einen thread erstellt brauchst du dafür kein buch. das ist doch so simpel zu programmieren und zu verstehen.



  • bestell dir das buch lieber nicht.

    Wenig geeignet für Leser, die geringe Programmiererfahrung haben, solide Grundkenntnisse sind notwendig, z.B. auch Grundkenntnisse zu Entwurfsmustern oder Templates

    :p



  • Also, jemandem mit dem unregistrierten Namen "nnnnnnnnnnn" zu glauben, das man DIESES Buch braucht... man, du bist aber leichgläubig.

    Egal ob Boost-Thread, wxThread usw., unter Windows sind es IMMER Windows-Threads. Nur kapseln Boost und wxWidgets halt die Windows-Threads, mehr nicht.

    WAS verstehst du denn an Threads nicht? Weißt du nicht was du damit anfangen sollst? (dann hast du auch keinen Bedarf und solltest dich auch erstmal damit nicht beschäftigen) Oder funktioniert deine technische Umsetzung nicht? Oder willst du nur Aufmerksamkeit? Rück mal konkret mit dem Problem raus, sonst kann dir niemand helfen.



  • Ich dachte das Problem hätte ich hier schon mehrfach beschrieben.Oo

    Okay, ich hätte dieses Buch heute bestellt, weil ich endlich mal ne vernünftige Referenz haben will.
    Ich habe jetzt zig Tuts zu dem Thema Threads durchgelesen und ich komm einfach nicht zurecht damit.

    Ich hab 2 Buttons.
    Button1 = Start
    Button2 = Stop

    Wenn Button 1 gedrückt wird, startet eine Funktion mit einer Schleife. Diese Schleife hat eine Sleepfunktion mit drin.
    Button 2 soll die Schleife sozusagen stoppen. Leider reagiert nix mehr, wenn ich ohne Threads auf Button 1 drücke. Deswegen brauch ich die Threads.

    Mein Problem ist folgendes:
    Ich habe mir jetzt das Layout meines Programms zurechtdesigned. Die IDE(wxDev-cpp) liefert mir schon das lauffähigen Code mit, so das ich nur noch den Custom-Code einfügen brauch. Dummerweise weiß ich nicht, wo ich den Konstruktor und Destruktor einbringen soll. In die Hauptklasse? Extraklasse? Childclass von der Hauptklasse?

    In den Tuts stand bisher immer nur der Code, wo der Thread dann gestartet wird usw., aber nicht wo man den Konstruktor/Destruktor hinkritzelt.

    Ich sag doch, ich bin einfach zum dämlich für Threads. 😞



  • Takeo du brauchst ein C++ Buch und kein Buch über Threads. ⚠



  • Ich hab 3 Bücher darüber und das einzige womit ich Probleme hab sind Klassen und Threads. Bis jetzt jedenfalls. Alles was vor den Klassen dran kam war nicht das Problem.
    Naja, jetzt sind bald Ferien und da werd ich mich mal hinsetzen und versuchen das ganze zu verstehen.



  • Also wenn man Klassen noch nicht mal richtig verstanden hat, dann sollte man sich noch lange nicht mit dem Thema Threads mit C++ beschäftigen (und GUI auch nicht).



  • Okay. Wenn das eine Empfehlung ist, dann nehm ich mir die mal an. Hat vielleicht keinen Sinn, vorzugreifen, wobei das Programmierproblem im Moment mehr bei Threads liegt.



  • Also...

    du willst eine abstrakte Klassen verwenden

    bedeutet du solltest objektorientiert Programmieren können.

    Daher ist in deinem Buch das Thema Klassen wichtig...du solltest unbedingt wissen wie Klassen aufgebaut sind, was vererbung ist und wie man interfaces und abstrakte Klassen verwendet.

    Anschliessend schaust du dir die Threads an - damit du weißt, was ein Thread ist und wie man einen Thread erstellt und verwendet (da dürften dann auch die Tutorials ausreichen)

    oder du verwendest nicht C++ sondern C - da mußt du über Klassen nichts wissen...aber das ist dann eben was anderes. Empfehlen würd ich jedoch bei C++ zu bleiben und diese Dinge zu verstehen.

    Gruß Andy



  • Takeo schrieb:

    Ich hab 2 Buttons.
    Button1 = Start
    Button2 = Stop

    Wenn Button 1 gedrückt wird, startet eine Funktion mit einer Schleife. Diese Schleife hat eine Sleepfunktion mit drin.
    Button 2 soll die Schleife sozusagen stoppen. Leider reagiert nix mehr, wenn ich ohne Threads auf Button 1 drücke. Deswegen brauch ich die Threads.

    Während des sleeps kannst du auch einen thread nicht "vernünftig" stoppen.

    Aber du hast schon recht. Deine schleife blockiert eben den hauptthread.

    Wenn du nichts groß zwischen haupt- und workerthread austauschen musst dann leitest du eine klasse von wxThread ab.

    class worker : public wxThread{
            public:
                 worker(){}
                 void * Entry();
    };
    
    void * worker::Entry(){
         while(true){
                if(TestDestroy()) //testen ob wir uns beenden sollen
                     break;
                //mach was
                wxThread::Sleep(10); //Schlafe, besser ist Yield()
         }
         return NULL;
    }
    

    Damit du den thread aus dem hauptthread benutzen kannst musst du ihn kreieren.

    class mainthread : public wxFrame{
         public:
             //was hier eben so kommt
             const bool create_and_run_worker();
             void some_methode_to_cancel_the_thread();
         private:
             worker *worker_;
    
    };
    
    const bool mainthread::create_and_run_worker(){
           if(!worker_)
                worker_=new worker();
    
           switch(worker_->Create()){
                     case wxTHREAD_NO_ERROR:{
                      worker_->SetPriority(WXTHREAD_DEFAULT_PRIORITY);
                      worker_->Run();
                      return true;
                      }
                    case wxTHREAD_NO_RESOURCE:  
                    case wxTHREAD_RUNNING:return false;
                    default: return false;
           }
    }
    
    //wenn jetzt der thread beendet werden soll 
    
    void mainthread::some_methode_to_cancel_the_thread(){
        if(worker_){
            worker_->Delete();
            //bei non-detached threads muesstest du auch noch das object frei geben
            //delete worker_;
        }
    }
    

    Wenn du noch gemeinsame resourcen hast musst du aufpassen. Aber das sind typische mt-themen. Mutexes, semaphoren und critical sections sagen dir sicher was.

    Es gibt auch noch eine nette klasse wxThreadHelper von der du deinen frame ableiten kannst. Dann gestaltet sich das noch etwas einfacher. Aber das vorgehen ist im prinzip das selbe.

    Sofar....


Anmelden zum Antworten