dde poke time out bei wxServer



  • hallo,

    ich bin mir nicht sicher, ob dies das richtige forum ist. das eigentliche problem dürfte mit dde zu tun haben, beruht aber auf der wxWidgets implementierung von dde. ursprünglich hatte ich die frage im wxWidgets forum gestellt, dort konnte mir aber niemand weiterhelfen.

    mein programm öffnet einen bestimmten dateityp. ich möchte erreichen, dass wenn eine instanz des programmes schon läuft, keine neue instanz geöffnet wird, sondern der open befehl mit paramtern an die bereits laufende instanz weitergeleitet wird.
    das schlaue internet sagt mir, das geht unter windows am besten mit dde, speziell mit der wxWidgets version mittels wxServer, wxClient und wxConnection.
    es klappt auch alles wunderbar, nur leider sind beim öffnen der datei, also nach übergabe der parameter, noch weitere userabfragen notwendig. und wenn diese nicht innerhalb von ca. 8 sekunden erfolgt sind, bekomme ich die fehlermeldung "DDE poke request failed: a request for a synchronous poke transaction has timed out."

    ich kann leider nichts finden, wie ich den time out erhöhen kann oder was ich sonst tun kann, um den time out zu verhindern. die usereingaben sind inhaltlich unumgänglich.

    hier ist mein dde code:

    #ifndef __IPC_SERVER_CLIENT_H__
    #define __IPC_SERVER_CLIENT_H__
    
    #include <wx/ipc.h>
    
    // 
    class ipcServerConn : public wxConnection {
    public:
    	ipcServerConn() : wxConnection()
    	{
    		//OutputDebugString(_("servConn an ctor\n"));
    	}
    	~ipcServerConn(){};
    	virtual bool OnPoke(const wxString& topic, const wxString& item, wxChar *data, int size, wxIPCFormat format);
    };
    
    class ipcClientConn : public wxConnection {
    public:
    	virtual bool Poke(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT){
    		//OutputDebugString(_("clientConn poke\n"));
    		return wxConnection::Poke(item, data, size, format);
    	}
    };
    
    class ipcServer : public wxServer {
    public:
    	ipcServer() : wxServer(){
    		m_connection = NULL;
    		OutputDebugString(_("server an ctor\n"));
    	};
    	~ipcServer(){
    		if (m_connection){
    			m_connection = NULL;
    		}
    	}
    
    	wxConnectionBase *OnAcceptConnection(const wxString& topic)
    	{
    		//OutputDebugString(_("OnAcceptConnection\n"));
    		m_connection = new ipcServerConn();
    		return getConnection();
    	}
    
    	ipcServerConn *getConnection() { return m_connection; }
    
    private:
    	ipcServerConn *m_connection;
    };
    
    class ipcClient : public wxClient {
    public:
    	ipcClient() : wxClient(){
    		m_connection = NULL;
    	};
    
    	~ipcClient(){
    		delete getConnection();
    	}
    
    	wxConnectionBase *OnMakeConnection(wxString &topic){
    		//OutputDebugString(_("topic\n"));
    		return new ipcClientConn();
    	};
    
    	bool Connect(const wxString& sHost, const wxString& sService, const wxString& sTopic){
    		m_connection = (ipcClientConn*) MakeConnection(sHost, sService, sTopic);
    		return getConnection() != NULL;
    	}
    
    	ipcClientConn *getConnection(){ return m_connection; }
    	bool IsConnected() { return m_connection != NULL; };
    
    private:
    	ipcClientConn *m_connection;
    };
    
    #endif
    

    und

    #include "mainframe.h"
    #include "ipcserverclient.h"
    #include "app.h"
    
    // damit wxGetApp() funktioniert
    DECLARE_APP(App)
    
    bool ipcServerConn::OnPoke(const wxString& topic, const wxString& item, wxChar *data, int size, wxIPCFormat format)
    {
    	MainFrame *mf = (MainFrame*) wxGetApp().GetTopWindow();
    	// hier wird die funtion mit den userabfragen gestartet
    	mf->openS0File(data);
    	//OutputDebugString(_("servConn poked\n"));
    	return wxConnection::OnPoke(topic, item, data, size, format);
    }
    

    falls eine zweite instanz des programmes startet und feststellt, dass bereits eine instanz (und dort dann auch ein wxServer) läuft, benachrichtigt es diese instanz mittels:

    // client erstellen
    	ipcClient *cli = new ipcClient;
    
    	// argumente an vorher gestartetes programm (server) weitergeben
    	wxString argsString = argv[1];
    	if(cli->IsConnected())
    		cli->getConnection()->Poke(_T("args"), (wxChar *)argsString.c_str());
    	delete cli;
    

    wie bekomme ich den time out fehler weg?!

    vielen dank!


Anmelden zum Antworten