WaitForMultipleObjects / Handle zum array übergeben



  • Hallo,
    danke erstmal für Eure Hilfe bisher.
    Leider habe ich noch ein Problem.
    Ich möchte mit oben genannter Funktion auf 2 Signale warten.
    Ich mache das so:

    private:
    		DWORD dwWaitResult;
    		bool show;
    		int x,y;
    		array<HANDLE>^ signal_array;
    		Point* pData;
    		HANDLE hMapFile;
    	private: System::Windows::Forms::PictureBox^  pictureBox1;
    
    	public:
    		Cursor_Form(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Add the constructor code here
    			//
    			show=false;
    			signal_array=gcnew array<HANDLE>(2);
    		}
    
    void open_Events(void)
    {
    	signal_array[0]= OpenEvent( EVENT_ALL_ACCESS,
    						FALSE,				//must be set to false
    						"show_Event");		//name of the event object 
    	if (signal_array[0] ==NULL)
    	{
    		MessageBox::Show("could not open Event [0]", "Error", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
    		ExitProcess(0); 
    	}
    	signal_array[1]= OpenEvent( EVENT_ALL_ACCESS,
    						FALSE,				//must be set to false
    						"oppacity_Event");		//name of the event object 
    	if (signal_array[1] ==NULL)
    	{
    		MessageBox::Show("could not open Event [1]", "Error", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
    		ExitProcess(0); 
    	}
    }
    

    und dann kommts...

    dwWaitResult=WaitForMultipleObjects(2 ,&signal_array,false, INFINITE);
    

    hier liegt der Fehler.
    Ich kann das Handle für das Array in nicht richtig übergeben!
    Ich währe mal wieder dankbar für Eure Hilfe.

    Vielen Dank



  • "signal_array" muss ein umnagaed array sein, da WaitForMultipleObjects auch unmanaged ist (und es keine automatische konvertierung gibt). ALso:

    HANDLE signal_array[2];
    


  • hab ich schon probiert:

    public ref class Cursor_Form : public System::Windows::Forms::Form
    	{
    	private:
    		DWORD dwWaitResult;
    		bool show;
    		int x,y;
    		HANDLE signal_array[2];
    		//array<HANDLE>^ signal_array;
    		Point* pData;
    		HANDLE hMapFile;
    

    das gibt folgendes:

    Error	1	error C4368: cannot define 'signal_array' as a member of managed 'cursor_hider::Cursor_Form': mixed types are not supported
    

    Wahrscheinlich hab ich wieder was Grundlegendes falsch gemacht. 🙄



  • Du darfst es nicht als member der Klasse machen, sondern in der Methode lokal definieren.



  • ach so.
    Ich krieg langsam das wundern.
    Wieso kann ich nicht mal ganz "normal" 'n array machen, das als als Member der Klasse durchläuft?
    Soll ich dann, wenn ich das Array in open_Events erzeugt habe,es als Parameter der Funktion open mapping übergeben oder wie?
    Das kann ja nicht der Sinn der Sache sein.



  • Das Problem ist, dass Du hier managed und unmanaged Code mixst. Das ist IMHO nicht empfohlen. Warum verwendest Du nicht die passenden WaitHandle-Klassen aus dem .NET-Framework? (also z.B. AutoResetEvent, oder Mutex).
    Dann hättest Du die ganzen Probleme nicht. Da könntest Du einfach WaitHandle::WaitAll(...) aufrufen...



  • ganz einfach: ich wusste nicht das ich unmanaged code verwende, bzw. dass es auch eine Funktion gibt, die das ganze mit managed code macht.
    Ich habe das ganze System noch nicht komplett durchschaut. Allerdings wird mir jetzt einiges klarer.
    Ich werde mal nach WaitAll() gucken.



  • so, jetzt hab ich nachgeschaut.
    WaitAll() wartet auf alle Signal, erst wenn alle signaled sind kommt ein true zurück. Das ist micht das gleich wie WaitForMultipleObjects, das sollte nämlich auf irgendeines der Signale warten, und das ist es was ich brauche.



  • WaitAny 🙄



  • ok danke.
    ich hab dann mal in der msdn nachgeschaut, aber mit managed code sieht das alles ziemlich kompliziert aus. Ich durschau das nicht mehr, muss aber heute noch fertig werden.
    Ich weiss, dass das hier nicht gerne gesehen wird, aber könnte mir jemand den Code posten, wie ich zwei Events öffne, und dann mit WaitAny auf eines von beiden warte?
    Währe sehr nett.... 😃



  • Originalhanno schrieb:

    ich hab dann mal in der msdn nachgeschaut, aber mit managed code sieht das alles ziemlich kompliziert aus. Ich durschau das nicht mehr, muss aber heute noch fertig werden.

    Wenn Du heute noch fertig werden willst, dann solltest Du nicht so ein murx aus managed und unmanaged Typen machen. Da wirst Du später nie mehr durchblicken (geschweige denn jetzt).

    Originalhanno schrieb:

    Ich weiss, dass das hier nicht gerne gesehen wird, aber könnte mir jemand den Code posten, wie ich zwei Events öffne, und dann mit WaitAny auf eines von beiden warte?

    Da ich nicht weiss was Du genau machen willst, kann ich Dir da nicht so viel helfen. Und eine

    gcnew AutoResetEvent();
    

    wirst Du ja selber hinbekommen, oder?
    Und ein

    array<WaitHandle^>^ handles
    

    an

    WaitHandle::WaitAny(handles);
    

    zu übergeben dürfte ja auch nicht so schwierig sein...



  • danke für die Mühe.
    Allerdings habe ich mich noch nicht mit managed Code beschäftigt, deshalb sieht das ganze für mich aus, als wenns ne neue Sprache währe.
    Die Hilfe in der MSDN durchschau ich auch nicht:

    [C++]
    public __gc __sealed class AutoResetEvent : public WaitHandle
    

    😮 kann ich nix mit anfangen, dazu fehlt mir was...

    Also werd ich wohl aufgeben müssen, wenn es nicht eine Möglichkeit gibt, das ganz mit unmanaged Code zu machen. 😞



  • Originalhanno schrieb:

    Allerdings habe ich mich noch nicht mit managed Code beschäftigt

    Hmm... was soll ich jetzt dazu sagen? Verwendest Du Windows-Forms? Ja? Na dann hast Du Dich schon mit managed Code beschäftigt.
    Wenn Du unmanaged machen willst, verwende MFC oder sonstige UI-Libs!!!!!

    Originalhanno schrieb:

    deshalb sieht das ganze für mich aus, als wenns ne neue Sprache währe.

    Es ist eine standardisierte Erweiterung von C++.

    Originalhanno schrieb:

    Also werd ich wohl aufgeben müssen, wenn es nicht eine Möglichkeit gibt, das ganz mit unmanaged Code zu machen. 😞

    Natürlich geht es mit unmanaged Code! Aber Du verwendest sowohl managed als auch unmanaged Code!

    Fazit: Verwende entweder unmanaged Code oder managed Code. Aber bitte mische es nur, wenn Du genau tust was Du machst!



  • Fazit: Verwende entweder unmanaged Code oder managed Code. Aber bitte mische es nur, wenn Du genau tust was Du machst!

    😃
    Werd ich machen, äh tun...



  • Originalhanno schrieb:

    Werd ich machen, äh tun...

    Mist... Du hast es gemerkt 🕶


Anmelden zum Antworten