wxWidgets Multithreading mit Klassen



  • Ich habe mir schon die Finge Wund gegoogelt und auch ein paar Leute gefunden , die das selbe fragten wie ich fragen werde , doch so eine richtige Antwort wie das funktioniert haben sie nicht bekommen .

    Also Ich möchte gerne eine Funktion in einem extra Thread ausführen lassen .

    AutoITEditDlg::AutoITEditDlg(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
    : wxDialog(parent, id, title, position, size, style) 
    
    {
        CreateGUIControls();      
        //hier w+rde ich gerne die Funktion void AutoITEditDlg::Highlight()       //ausführen lassen
    
    }
    
    void AutoITEditDlg::CreateGUIControls()
    {
    //Hier wird natürlich noch mehr gemacht , aber das brauchst du denke ich //mal nicht ...
        WxRichTextCtrl1 = new wxRichTextCtrl(this, ID_WXRICHTEXTCTRL1, wxT(""), wxPoint(0, 0), wxSize(797, 405), wxTAB_TRAVERSAL | wxWANTS_CHARS | wxVSCROLL | wxHSCROLL | wxNO_BORDER | wxRE_MULTILINE, wxDefaultValidator, wxT("WxRichTextCtrl1"));
    
    }
    
    void AutoITEditDlg::Highlight()
    {
    //...
    WxRichTextCtrl1->GetValue()
    //...
    }
    

    Hat vielleicht jemand eine Idee wie ich das bewerkstelligen könnte und zwar mithilfe von Threads ?



  • Wo liegt denn dein Problem? Verstehst du die Benutzung von wxThread nicht? Hast du Probleme mit der Benutzung von GUI-Funktionen im Thread?


  • Mod

    Klasse von wxThread ableiten, und da dann das benötigte tun.
    Du kannst aber _nicht_ aus einem solchen Thread auf die GUI zugreifen, da dies Sache des Hauptthreads ist. In diesem Fall wirst du also ein eigenes Event entsprechend implementieren müssen, welches dann an den Hauptthread gesandt werden kann.



  • mein Problem liegt da , dass ich nicht weiß wie ich das so hinbekommen soll , dass Ich trotzdem die Befehle in den Klassen benutzen kann .

    Ich versteh einfach nicht , wie ich das umsetzen soll , einer meiner Ansätze bisher :

    void AutoITEditDlg::CreateGUIControls()
    {
        WxRichTextCtrl1 = new wxRichTextCtrl(this, ID_WXRICHTEXTCTRL1, wxT(""), wxPoint(0, 0), wxSize(797, 405), wxTAB_TRAVERSAL | wxWANTS_CHARS | wxVSCROLL | wxHSCROLL | wxNO_BORDER | wxRE_MULTILINE, wxDefaultValidator, wxT("WxRichTextCtrl1"));
    
    }
    
    class MessageThread : public wxThread , public AutoITEditDlg
    {
    public:
        MessageThread();
    public:
    
    void *Entry(void)
      {
       // Meine Funktionen halt bspw : WxRichTextCtrl1->GetValue();
      }
    };
    
    AutoITEditDlg::AutoITEditDlg(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
    : wxDialog(parent, id, title, position, size, style) 
    
    {
    	CreateGUIControls();      
            wxThread *_hThread = new MessageThread();
            _hThread->Create();
            _hThread->Run();
    
    }
    

    So funktioniert das aber nicht ... warum nicht ?


  • Mod

    Weil du die Threadklasse nicht auch von einer GUI Klasse erben lassen kannst.
    Du musst die ergebnisse des Threads per Event an den Hauptthread, welcher die GUI enthält, übergeben.



  • Ich muss aber garkeine Ergebnisse austauschen , ich verändere nur ein paar Sachen
    wie beispielsweise den Text der Richbox auslesen lassen und dann in eine Datei schreiben lassen ...
    Wie funktioniert das denn sonst wenn nicht so ?
    Kannst du mir bitte ein Code Snippet geben ?
    Ich steh gerade echt auf der Leitung , wie ich das anders machen soll ...


  • Mod

    Was willst du überhaupt in dem Thread machen?
    Und warum ein eigener Thread? Geht das in der GUI nicht?
    Um den Inhalt eines TextCtrls in eine Datei zu schreiben, brauchst du eigentlich keinen extra Thread...



  • Ich wollte eine Art Syntax Highlighting machen , da das bei größeren projekten etwas länger dauert (5-10 sec) und der Benutzer in dieser Zeit nichts in die Richbox schreiben kann , wollte ich das ganze eben in ein extra Thread machen lassen ...


  • Mod

    Dann musst du die Berechnung von der Textbox trennen, da du in Threads eigentlich keine GUI Elemente ansprechen kannst.



  • Danke du hast mich auf eine idee gebracht 😃

    Ich überge den Text , der "untersucht" werden soll in eine Funktion und lass dort dann nach den Stellen suchen , die geändert werden sollen anschliesend kommt alles in ein array , nur eine kleine Frage noch , wie mache ich das return für das Array ?

    /* int  , int[]  , Int*  */ Berechne(String Text)
    {
    
    return Stellen[] ;
    }
    
    int main 
    {
    int Stellen[] ;
    Stellen=Berechne(Text);
    }
    

    Warscheinlich würde das so nicht funktionieren , aber wie dann (habe noch nie Arrays zurück gegeben ...)

    Danke für euere Hilfe 😃


  • Mod

    Nutz doch dafür einen std::vector<int> dann kannst du den an die Funktion per referenz übergeben.


Anmelden zum Antworten