Tegelijkertijd dingen uitvoeren

Status
Niet open voor verdere reacties.

BreVDD

Gebruiker
Lid geworden
9 apr 2009
Berichten
104
Hallo,

Is het mogelijk kom in C++ dingen tegelijkertijd te laten uitvoeren?

bv:

het programmaatje sluit af:
[cpp]
cout >> "Typ 5 om af te sluiten";
cin << Controle_Afsluiten;
/*er wordt 5 ingegeven*/
if (Controle_Afsluiten == 5)
{
cout << "U koos voor afsluiten, typ '1' om te annulleren!";
cin << Controle;

/*kan je er nu voor zorgen waneer je wacht op de cin dat het programma terwijl voortdoet en bv nog 10 seconden wacht en dan pas afsluit?*/
Sleep (10000);
}

[/cpp]

Hoppelijk heb ik mijn vraaag goed geformuleerd

groetjes

Brecht
 
Laatst bewerkt door een moderator:

Met threads kan je inderdaad dingen tegelijkertijd uitvoeren, maar volgens mij gaat dit het probleem van de TS niet oplossen. Hij gebruikt namelijk "cin" en, voor zover ik weet,blijft dat ook bij het gebruik van threads eeuwig wachten op invoer.
 
Met threads kan je inderdaad dingen tegelijkertijd uitvoeren, maar volgens mij gaat dit het probleem van de TS niet oplossen. Hij gebruikt namelijk "cin" en, voor zover ik weet,blijft dat ook bij het gebruik van threads eeuwig wachten op invoer.

Onderstaande code lijkt toch te lukken? Ik zie het probleem niet eigenlijk? De thread
zal de applicatie afsluiten na 10 seconden en de main thread zal de thread stoppen indien
de gebruiker een 1 ingeeft. Het is natuurlijk wel de bedoeling de thread te starten voor
het cin commando, anders kan je inderdaad eeuwen wachten.

[cpp]#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <iostream>
using namespace std;

void wait(int seconds);
DWORD WINAPI terminate(LPVOID Param); // zo moet elke thread functie eruitzien (functienaam mag
// natuurlijk verschillen

int main(void)
{
int Controle_Afsluiten = 0;
int Controle = 0;
DWORD ThreadId; // zal de id van de thread opslaan
HANDLE Thread_Handle; // zal gebruikt worden om de thread af te sluiten

cout << "Typ 5 om af te sluiten: ";
cin >> Controle_Afsluiten;

/*er wordt 5 ingegeven*/
if (Controle_Afsluiten == 5)
{
Thread_Handle = CreateThread(
NULL, // maak gebruik van de default veiligheidsattributen
0, // default stack grootte
terminate, // functie die de thread zal uitvoeren
NULL, // parameter van de functie (geen parameter nodig hier)
0, // default thread creation flags
&ThreadId); // zal thread Id teruggeven

cout << "U koos voor afsluiten, typ '1' om te annuleren!\n";
cin >> Controle;

if(Controle == 1)
{
TerminateThread(Thread_Handle, 0);
cout << "afsluiten geannuleerd.\n";
while(true)
{
// ga verder
cout << "GO\n";
wait(10);
}
}
}
}

DWORD WINAPI terminate(LPVOID Param)
{
wait(10);
exit(0);
}

void wait ( int seconds )
{
clock_t endwait;
endwait = clock() + seconds * CLOCKS_PER_SEC;
while (clock() < endwait);
}
[/cpp]

nieke_e zei:
Oh? Zou je dat willen uitleggen? Ik heb er zelf namelijk nooit problemen mee ondervonden
Hmja misschien een iets te persoonlijke mening en het is daarbovenop lang geleden dat ik boost gebruikt heb, Thread termination was bijvoorbeeld een 'pain in the ass'. Maarja *forget it.

Btw: Een fork() zou ook kunnen lukken, het heeft zo zijn voordelen en nadelen.
Bij een "normale" fork wordt een volledig nieuw proces gestart, terwijl dit niet het geval is bij een thread, in theorie
zou het childproces van een fork dus kunnen blijven lopen terwijl het moederproces crashed, het is wel belastender
voor het systeem.
 
Laatst bewerkt door een moderator:
OK bedankt allemaal

Ik was op reis dus ik kon even niet antwoorden
 
Onderstaande code lijkt toch te lukken? Ik zie het probleem niet eigenlijk? De thread
zal de applicatie afsluiten na 10 seconden en de main thread zal de thread stoppen indien
de gebruiker een 1 ingeeft. Het is natuurlijk wel de bedoeling de thread te starten voor
het cin commando, anders kan je inderdaad eeuwen wachten.

{code}


Hmja misschien een iets te persoonlijke mening en het is daarbovenop lang geleden dat ik boost gebruikt heb, Thread termination was bijvoorbeeld een 'pain in the ass'. Maarja *forget it.

Btw: Een fork() zou ook kunnen lukken, het heeft zo zijn voordelen en nadelen.
Bij een "normale" fork wordt een volledig nieuw proces gestart, terwijl dit niet het geval is bij een thread, in theorie
zou het childproces van een fork dus kunnen blijven lopen terwijl het moederproces crashed, het is wel belastender
voor het systeem.

Zou je nog even [cpp]Thread_Handle = CreateThread(
NULL, // maak gebruik van de default veiligheidsattributen
0, // default stack grootte
terminate, // functie die de thread zal uitvoeren
NULL, // parameter van de functie (geen parameter nodig hier)
0, // default thread creation flags
&ThreadId); // zal thread Id teruggeven[/cpp]
kunnen uitleggen want ik versta niet echt die nul en zo.
 
Laatst bewerkt door een moderator:
http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx hier vind je de volledige
uitleg van de createThread functie.

dit is het volledige prototype van de functie createThread:

PHP:
HANDLE WINAPI CreateThread(
  __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in       SIZE_T dwStackSize,
  __in       LPTHREAD_START_ROUTINE lpStartAddress,
  __in_opt   LPVOID lpParameter,
  __in       DWORD dwCreationFlags,
  __out_opt  LPDWORD lpThreadId
);

met de NULL en 0'en activeer ik gewoon de default waarden van de createThread functie voor gewoon gebruik is deze goed genoeg, zoals je ziet kan je bijvoorbeeld e stacksize regelen, een 0 geeft eenzelfde stack grootte aan de thread als aan de volledige exe.
Verder kan je met de dwCreationFlags bijvoorbeeld ervoor zorgen dat de thread pas geactiveerd wordt waneer jij het wilt etc.

Maar wat ik je aanraad is eerst te experimenteren met threads door de default waarden te gebruiken en als je wat handigere erin wordt en andere eisen hebt je wat te verdiepen in
de mogelijkheden.
 
Met threads kan je inderdaad dingen tegelijkertijd uitvoeren, maar volgens mij gaat dit het probleem van de TS niet oplossen. Hij gebruikt namelijk "cin" en, voor zover ik weet,blijft dat ook bij het gebruik van threads eeuwig wachten op invoer.

Ik ken nog niet echt veel van programmeren, kan je ook iets ander gebruiken i.p.v cin?

http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx hier vind je de volledige
uitleg van de createThread functie.

dit is het volledige prototype van de functie createThread:

{code}

met de NULL en 0'en activeer ik gewoon de default waarden van de createThread functie voor gewoon gebruik is deze goed genoeg, zoals je ziet kan je bijvoorbeeld e stacksize regelen, een 0 geeft eenzelfde stack grootte aan de thread als aan de volledige exe.
Verder kan je met de dwCreationFlags bijvoorbeeld ervoor zorgen dat de thread pas geactiveerd wordt waneer jij het wilt etc.

Maar wat ik je aanraad is eerst te experimenteren met threads door de default waarden te gebruiken en als je wat handigere erin wordt en andere eisen hebt je wat te verdiepen in
de mogelijkheden.

Ok bedankt
 
Laatst bewerkt door een moderator:
Threads! http://www.cs.cf.ac.uk/Dave/C/node29.html#SECTION002930000000000000000 dit is een url naar wat uitleg over pthreads (heb zelf deze sectie nooit gelezen, wel andere secties.)
Als je onder windows werkt, dan moet je wel naar andere threads zoeken, ik raad de boost
library wel af, deze is redelijk slecht, succes!


BOOST lib slecht????
Boost is zeker geen slechte lib, er zijn zoveel dingen beter dan de Standard Lib.

de boost Ptr en de boost Mutexen zijn zeker aanraders.
(Zelf de beste programmeurs raden het aan, Herb Sutter, C++ Coding Standards)!
 
BOOST lib slecht????
Boost is zeker geen slechte lib, er zijn zoveel dingen beter dan de Standard Lib.

de boost Ptr en de boost Mutexen zijn zeker aanraders.
(Zelf de beste programmeurs raden het aan, Herb Sutter, C++ Coding Standards)!

Als je onder Windows werkt gewoon de Windows API gebruiken IMO. Dus CreateThread, *CriticalSection functies, etc.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan