steinadler Geschrieben 19. September 2006 Geschrieben 19. September 2006 Hallo, ich habe von nem Kollegen gesagt bekommen, ich soll in mein Projekt folgende Zeilen einbauen: while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } Allerdings ist die Software auf MFC-Basis und da hab ich zwei Zeilen: BEGIN_MESSAGE_MAP(Crc_opcApp, CWinApp) END_MESSAGE_MAP() Ist damit denn nicht obiges schon erfüllt??? Zitieren
Guybrush Threepwood Geschrieben 19. September 2006 Geschrieben 19. September 2006 ??? Vielleicht schilderst du lieber das Problem das du mit deinem Programm hast. Denn das Eingangsposting ist recht Sinnlos. In einer MFC Anwendung musst du dich nicht selber um das Abfragen der Nachrichten vom System kümmern, da dies intern vom MFC Gerüst erledigt wird. Zitieren
steinadler Geschrieben 19. September 2006 Autor Geschrieben 19. September 2006 Ja eben. Also ich greife mit meiner DLL auf einen OPC-Server zu (zur Abfrage von Maschinendaten): byte read(); und void write(byte daten); Beim Schreiben erfolgt das ganze asynchron, d. h. mit write() wird der Schreibvorgang auf dem Server angestoßen und wenn er fertig ist, kommt einer Callbackfunktion vom Server zurück, mit dem Resultat des Schreibvorgangs. In meinem Projekt, von dem aus ich auf die DLL zugreife befinden sich drei buttons (lesen; schreiben; mehrere Daten schreiben). Wenn ich auf schreiben klicke, wird korrekt der Schreibvorgang angestoßen und die Callbackfunktion kommt zurück. Beim Schreiben meherer Daten allerdings, kommt die Callbackfunktion erst zurück, wenn die aufrufende Funktion (Funktion des Buttons _onclick) verlassen wird. Demzufolge tritt die Callbackfunktion nie ein wenn in dem Clientprojekt ständig geschrieben wird. Woran liegt das? Zitieren
Klotzkopp Geschrieben 19. September 2006 Geschrieben 19. September 2006 Ich bin ziemlich sicher, die Callbackfunktion kommt schon früher zurück. Du siehst davon nur nichts, weil du die Nachrichtenschleife blockierst. Zitieren
steinadler Geschrieben 19. September 2006 Autor Geschrieben 19. September 2006 und an was könnte das liegen? Habe in die Callback ne Messagebox eingebaut, die kommt auch erst so spät Zitieren
Klotzkopp Geschrieben 19. September 2006 Geschrieben 19. September 2006 Wie sieht denn dieser Callback aus? Gibst du einen Funktionszeiger an, oder läuft das auch über eine Windows-Nachricht? Zitieren
steinadler Geschrieben 19. September 2006 Autor Geschrieben 19. September 2006 Also der direkte Aufruf des Servers sieht so aus: // // OnWriteComplete called by OPC server when an async write request has been carried out // STDMETHODIMP COPCDataCallback::OnWriteComplete( /* [in] */ DWORD dwTransid, /* [in] */ OPCHANDLE hGroup, /* [in] */ HRESULT hrMastererr, /* [in] */ DWORD dwCount, /* [size_is][in] */ OPCHANDLE __RPC_FAR *pClienthandles, /* [size_is][in] */ HRESULT __RPC_FAR *pErrors) { m_pParent->CallbackWriteComplete(dwTransid, hrMastererr); return S_OK; }; und CallbackWriteComplete(...) ist meine Funktion. Zitieren
steinadler Geschrieben 19. September 2006 Autor Geschrieben 19. September 2006 Hab das Problem jetzt gefunden. Der OPC-Server basiert ja auf COM-Technologie. Und beim Initialisieren mittels CoInitialize hab ich vergessen "Multithreaded" als Parameter anzugeben. Jetzt funktionierts Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.