Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » WaitForSingleObject

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.01.2006, 11:50 Uhr
~Nahasa
Gast


hi kleines testApp



Code:

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;

void thread (PVOID pvoid);
void thread2 (PVOID pvoid);

int main(int argc, char *argv[])
{
  
    HANDLE hEvent1= CreateEvent(NULL,FALSE,FALSE,NULL);
    HANDLE hEvent2= CreateEvent(NULL,FALSE,FALSE,NULL);
    
    _beginthread(thread,0,&hEvent1);
    _beginthread(thread2,0,&hEvent2);
    
    while (true)
    {
     int i ;
     cin>>i;
     if (i==1)SetEvent(hEvent1);
     else
          SetEvent(hEvent2);
    };
    system("PAUSE");
    return EXIT_SUCCESS;
}


void thread (PVOID pvoid)
     {
     HANDLE hEvent=(HANDLE)pvoid;
     while (true)
           {
           WaitForSingleObject(hEvent,INFINITE);
           for(int i=0;i<10;i++)
              cout<<".";      
           }
     }
;

void thread2 (PVOID pvoid)
     {
     HANDLE hEvent=(HANDLE)pvoid;
     while (true)
           {
           WaitForSingleObject(hEvent,INFINITE);
           for(int i=0;i<10;i++)
              cout<<"-";      
           }
     }
;






wieso wartet mein programm nicht auf die Flags?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.01.2006, 11:59 Uhr
Pler
Einer von Vielen
(Operator)



Code:
HANDLE hEvent1= CreateEvent(NULL,FALSE,FALSE,NULL);



IMO kannst du nicht als letztes Argument NULL angeben.

Ich kenn das so:


Code:

#define N_EVENT1 "namedeserstenevents"

.
.
.
HANDLE hEvent1= CreateEvent(NULL,FALSE,FALSE,N_EVENT1);



Das mit dem define ist ganz gut, dass man sich nicht vertippt, wenn an zwei Stellen Handles erzeugt werden sollen. (Was ja meist der Fall ist)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.01.2006, 12:05 Uhr
~Nahasa
Gast


der Ereignisame spielen doch nur eine Rolle, wenn das Ereignisobjekt prozeßübergreifend genutzt wird . Dies ist hier jedoch nicht der Fall oder?
Ich habe es eben auch noch mal schnell getestet es mmacht keinen unterschied....
LG Boffi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.01.2006, 12:11 Uhr
Pler
Einer von Vielen
(Operator)


Ok, kann sein. War ja nur ein Vorschlag.


Zitat von msdn:

If lpName matches the name of an existing named event object, the bManualReset and bInitialState parameters are ignored because they have already been set by the creation process.


Dachte, vielleicht fuscht dir Windows, oder deine Entwicklungsumgebung da rein.

msdn - CreateEvent


Also ich würde probieren das handle nicht zu übergeben, sondern im Thread neu zu erzeugen (dann brauchst du natürlich auch auf jeden Fall die Namen).
Das mit dem Übergeben habe ich noch nicht gesegen.
Komisch ist auch, dass du die Adresse des Handles übergibst, und dann direkt an ein handle zuweist.

Code:
     //hier:
    _beginthread(thread2,0,&hEvent2);
void thread (PVOID pvoid)
     {
     // bzw. hier:
     HANDLE hEvent=(HANDLE)pvoid;


Dieser Post wurde am 25.01.2006 um 12:15 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.01.2006, 22:02 Uhr
~NAHA
Gast


Wenn ich sie im Thread selber mit CreateEvent erzeuge... wie soll ich denn dann von außerhalb also der Main-funktion drauf zu greifen?!
Pvoid-variable dient ja nur zum Datenaustausch mit den Hauptthread, ob da nun handel vom Event drin ist oder ein kompletter Struct übergeben wird ist doch egal....vielleicht hab ich es auch falsch verstanden vielleicht hast mal Codebeispiel ?!

LG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.01.2006, 22:10 Uhr
Pler
Einer von Vielen
(Operator)



Zitat:

wie soll ich denn dann von außerhalb also der Main-funktion drauf zu greifen



na du schreibst die eine Zeile

Code:
HANDLE hEvent1= CreateEvent(NULL,FALSE,FALSE,N_EVENT1);


einfach jeweils im main und in der tread-funktion.
Durch den (hoffentlich) eindeutigen Namen hinter N_EVENT1 wird sichergestellt, dass hinter beiden handles das gleiche Event steckt.

Der Zeiger den man da übergeben kann, kann man sicherlich auch für viele andere schöne Sachen nutzen; sicherlich aber auch so wie du.
Ich bin mir aber ziemlich sicher, dass du die Zuweisung dann anders machen musst. Hier mein Vorschlag:

Code:
HANDLE hEvent=(HANDLE)*pvoid;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.01.2006, 09:13 Uhr
~NAHASA
Gast


ok ich glaub das war es ...... ich hab den Eventhandel einfach mal global gesetzt, da ich der 2 maligen Erzeugung nicht so ganz vertraut habe kann es sein das die WaitSingleObeject Event wieder zurücksetzt ?! Sieht jedenfalls ganz so aus hier noch mal der COde

Code:

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <process.h>
#define N_EVENT1 "ne1"
#define N_EVENT2 "ne2"
#define repeat 100000
using namespace std;

void thread (PVOID pvoid);
void thread2 (PVOID pvoid);

HANDLE hEvent1= CreateEvent(NULL,FALSE,FALSE,N_EVENT1);
HANDLE hEvent2= CreateEvent(NULL,FALSE,FALSE,N_EVENT2);
BOOL con1=TRUE;
BOOL con2=TRUE;
int main(int argc, char *argv[])
{
  

    
    _beginthread(thread,0,NULL);
    _beginthread(thread2,0,NULL);

int i;
    while (true)
    {
     cin>>i;
     if (i==1)
        {
         con1=TRUE;
         SetEvent(hEvent1);
        }
     if (i==2)
        {
         con2=TRUE;
         SetEvent(hEvent2);
        }
     if (i==3)
        {
         con1=FALSE;
         ResetEvent(hEvent1);
        }
     if (i==4)
        {
         con2=FALSE;
         ResetEvent(hEvent2);
        }
     for(int x=0;x < 10000;x++)
         cout<<"o";      
    };
    system("PAUSE");
    return EXIT_SUCCESS;
}


void thread (PVOID pvoid)
     {
//     HANDLE hEvent=(HANDLE)pvoid;  
     while (true)
           {
           DWORD err=WaitForSingleObject(hEvent1,INFINITE);          
           if (err==WAIT_FAILED)
                      {
                      cout<<GetLastError();
                      system("PAUSE");
                      }
           for(int i=0;i<repeat&&con1;i++)
              cout<<".";      
           }
     }
;

void thread2 (PVOID pvoid)
     {
//     HANDLE hEvent=(HANDLE)pvoid;
//     HANDLE hEvent2= CreateEvent(NULL,FALSE,FALSE,N_EVENT2);
     while (true)
           {
           DWORD err=WaitForSingleObject(hEvent2,INFINITE);          
            if (err==WAIT_FAILED)
                      {
                      cout<<GetLastError();
                      system("PAUSE");
                      }
           for(int i=0;i<repeat&&con2;i++)
              cout<<"-";      
           }
     }
;





also besten dank
LG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.01.2006, 09:29 Uhr
Pler
Einer von Vielen
(Operator)



Code:
HANDLE hEvent1= CreateEvent(NULL,FALSE,FALSE,N_EVENT1);


Das zweite Argument (also das erste FALSE) gedeuted, dass das Event automatisch zurückgesetzt wird.
Wenn du dort TRUE einträgst, dann geht das manuell durch ResetEvent()
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
26.01.2006, 09:58 Uhr
Nahasapeeemapetilon



ich versteh thx .....muss mal sagen hier gibts wirklich schnell hilfe ich sollte öffters hier mal vorbei schauen ......
achso und

Code:

_beginthread(thread2,0,&hEvent2);


hattest du auch recht der Adressoperator war falsch ...ohne gehts dann auch

LG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: