Multithread Application



  • &junix:
    Okay, das mit Execute etc hab ich inzwischen verstanden und das mit dem Threads klappt ganz gut.
    Jedoch gibt es da eine kleine Komplikation mit dem 2. Thread:
    Im ihm wird eine DLL Funktion aufgerufen. Diese Funktion hat 3 Parameter: einen Int, einen Char und wieder einen Int. Die beiden Ints sind Parameter, die das Verhalten der Funktion im "Dll-Inneren" bestimmen, der Charparameter jedoch gibt nur einen Speicherort wieder. Das heißt, dass in diesem Char-Array (um genauer zu sein) eine Zeichenkette von der DLL Funktion abgespeichert wird.
    Seitdem ich diesen DLL-Aufruf jetzt in einem eigenen Thread habe, wird dieses Char-Array allerdings nicht mehr beschrieben, es ist also leer.
    Und ich weiß nicht woran das liegen könnte.
    Danke



  • Zeig mal die Funktionsdeklaration und die Zeilen in denen du den String zuweist. Eventuell ist es auch ein Synchronisationsproblem. Schau dir mal in der Hilfe die Stichwörter TCriticalSection (wars glaub ich) an.

    -junix



  • Danke, ich habe schon (ohne Erfolg jedoch) mit TCriticalSection gearbeitet.
    Ich zeige dir mal den Code:

    /* unit1.h */
    int Status;
    char fname[1024];
    
    class TForm1 : public TForm
    {
    ... blablabla ...
    };
    
    /* unit1.cpp bei OnButtonClick */
    void __fastcall TForm1::BitBtn3Click(TObject *Sender)
    {
    ...
             //Der Thread ist in der Unit3.h definiert
             TReleaseShutterThread *trst = new TReleaseShutterThread(true);
             trst=&TReleaseShutterThread(true);
             trst->Priority=tpNormal;
             trst->Resume();
    ...
    }
    
    /* unit3.h */
    class TReleaseShutterThread : public TThread
    {            
    private:
    protected:
            void __fastcall Execute();
    public:
            void __fastcall Release();
            __fastcall TReleaseShutterThread(bool CreateSuspended);
    };
    
    /* unit3.cpp -> Dort findet der Aufruf statt! */
    TDLLTest::TDLLTest()
    {
       HINSTANCE hInstance;
    
       hInstance = ::LoadLibrary("G2R.dll");
       pDllFunction  = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "ReleaseShutter");
    }
    
    int TDLLTest::CallDllFunction(int iTest1, const char* pFile, int iTest2)
    {
        int iResult;
    
        if (pDllFunction)
            iResult = (*pDllFunction)(60, fname, sizeof(fname));
        return iResult;
    }
    
    void __fastcall TReleaseShutterThread::Release()
    {
     TDLLTest Dll;
     Status=Dll.CallDllFunction(60, fname,sizeof(fname));
    }
    
    void __fastcall TReleaseShutterThread::Execute()
    {
     Synchronize(Release);
    }
    

    Das DLL-Aufrufbeispiel entnahm ich der FAQ, funktionierte ganz gut.
    So, wenn ich jetzt die Variablen int Status und char fname[1024] auslesen will, sind sie immer leer.
    Danke junix

    [ Dieser Beitrag wurde am 01.06.2003 um 20:41 Uhr von PCMan editiert. ]



  • Den Code in der DLL hast du auch?

    Verwende in der DLL mal ein TCriticalSection-Objekt welches du beim Eintritt in die Funktion mit Lock() blockierst und Unlock wieder löst beim Austritt aus der Funktion?

    -junix



  • &junix:
    Ja, das Problem ist eben, dass ich nur die DLL habe und nicht den Code darin.
    Interessanterweise lief das alles problemlos, als das Einbinden der DLL und deren Aufruf sowie die Variablen alle noch in der unit1.h waren.
    Also kann es nur an den Threads liegen.
    Reicht es, wenn ich den Aufruf der DLL in eine CriticalSection packe? Vielleicht hab ich die CriticalSection nur falsch gesetzt?

    [ Dieser Beitrag wurde am 02.06.2003 um 12:54 Uhr von PCMan editiert. ]



  • Jo, doch das müsste reichen... Aber natürlich konsequent... hmm

    Ich denk mal über dein problem nach... Rufst du die DLL-Funktion in verschiedenen Threads "gleichzeitig" auf?

    -junix



  • &junix:
    Negativ, dieser Thread mit dem DLL-Call wird nur einmal aus Unit1.cpp aufgerufen.
    Wo genau müsste ich denn die CriticalSection hinpacken? Ich hab es einmal in unit1.cpp versucht, und zwar an der stelle:

    void __fastcall TForm1::BitBtn3Click(TObject *Sender)
    {
    ...
             //Der Thread ist in der Unit3.h definiert
             TCS->Aquire();
             TReleaseShutterThread *trst = new TReleaseShutterThread(true);
             trst=&TReleaseShutterThread(true);
             trst->Priority=tpNormal;
             trst->Resume();
             TCS->Release()
    ...
    }
    

    Vielleicht ist die stelle falsch?
    Oder die Umstände sind einfach so blöd, dass ich es hinnehmen muss, diesen Aufruf in der unit1.cpp zu lassen und damit ein kurzes Einfrieren zu riskieren 😢
    Danke nochmals, junix 🙂



  • Das war... ... voll der Zonk (o;

    Du müsstest die Critical Section nur Locken bevor du die DLL-Funktion aufrufst und gleich anschliessend freigeben. Aber da du die DLL Funktion ehnur an einem Örtchen aufrufst, kannst du sie auch weglassen, dann ists kein Synchronisationsproblem... ...Was mach die DLL_Funktion denn? Irgendwelche WindowsMessages versenden?

    -junix



  • &junix:
    Die DLL kommuniziert mit einem Anderen Programm, dass im Background offen sein muss. Dieses Programm kann von dem PC aus den Auslöser einer Digitalkamera betätigen und das Bild fetchen.
    Aber was die Funktion in der DLL genau macht weiß ich nicht, und wie die Kommunikation läuft weiß ich auch nicht.



  • Gibst du der Funktion irgendwelche WindowHandles mit?

    -junix



  • Nein, 2 Integer, die irgendwas bestimmen (weiß gerade nicht genau was es ist) und einen Char, wo der Name des gefetchten Bildes abgespeichrt wird.... man ich bin echt am Verzweifeln.


Anmelden zum Antworten