PDA

Visualizza la versione completa : [C++] Più operazioni contemporaneamente


Squall1988
23-06-2005, 09:36
Vorrei includere nel mio programma in C++ alcune funzionalità che facciano eseguire operazioni indipendenti contemporaneamente, una specie di multitasking, che poi credo di aver capito si kiamino threads. essendo abbastanza ignorante in materia ho provato a fare una ricerchina ma nn sono riuscito a trovare/capire nulla di utile...

Non è che voi sapete darmi una mano??

Ad esempio c'è un orologio interattivo che ogni secondo si refresha, ma essendo l'orologio un loop infinito mi sarebbe impossibile fare altro nel frattempo, e invece io voglio fare altro :fagiano: :fagiano:

Squall1988
23-06-2005, 13:09
up :cry:

DYNAM!C+
23-06-2005, 13:43
immagino sia x windows.
cerca l'api "CreateThread" su MSDN

Squall1988
23-06-2005, 14:04
ci avevo guardato ma nn ci capisco niente. nn è ke esiste una guida un po' più chiara?

netarrow
23-06-2005, 19:32
esempio:



...
DWORD funzione_da_eseguire_in_thread_separato(LPDWORD lpdwParam) {
//codice
return 0;
}
...




...
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;
HANDLE thread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) funzione_da_eseguire_in_thread_separato,
&dwThrdParam, 0, &dwThreadId);
...



nelle pillole c'è una reference sulla api win32 chiara che puà essere complementare all'msdn

:ciauz:

Squall1988
23-06-2005, 20:30
Ho provato questo programma ma nn va molto bene


#include <windows.h>
#pragma comment (lib,"Kernel32.lib")
#include <iostream.h>
#include <stdlib.h>

DWORD funz1 (LPDWORD lpdwParam) {

for (int i = 0; ; i++)
{
cout << "\r" << i;
Sleep (1000);
}

return 0;

}


int main ()
{
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;

HANDLE thread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) funz1, &dwThrdParam, 0, &dwThreadId);

Sleep (20);
cout << endl;
cout << "Ciao a tutti" << endl;

for (int i = 0; ; i++)
{
cout << "\r" << i;
Sleep (1000);
}

return 0;
}

netarrow
23-06-2005, 21:43
guarda questo esempio:



#include <windows.h>
#include <iostream.h>
#include <stdlib.h>

DWORD funz1 (LPDWORD lpdwParam) {
for (int i = 0; ; i++)
{
int x = 0 + rand() % 1024;
//adatta alla tua risoluzione x e y
int y = 0 + rand() % 768;
SetCursorPos(x, y);
}

return 0;

}


int main () {
DWORD dwThreadId, dwThrdParam = 1;

cout << "Ciao, mentre stampo all'infinito i numeri l'altro\nthread muove a caso il cursore del mouse\n";

HANDLE thread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) funz1, &dwThrdParam, 0, &dwThreadId);

for (int i = 0; ; i++)
{
cout << "Ciclo numero " << i << " premere CTRL-C per terminare"<<endl;
}


return 0;
}



questo dimostra che il programma farà due cose contemporaneamente: sposterà a casaccio il cursore del mouse mentre stampa all'infinito dei numeri. Per terminarlo fai CTRL-C non tentare di muovere il mouse perchè tanto si risposta subito.

Credo che il tuo prima non andava perchè due thread si contendevano la stessa risorsa: la console e quindi andavano in conflitto.

:ciauz:

Squall1988
23-06-2005, 21:53
ah accidenti...
cmq esistono delle priorità?? xkè cmq il tuo programma stampa un po' a scatti

netarrow
23-06-2005, 22:00
a me stampa fluido, certo ci saranno delle api e delle tecniche per settare che thread ha la precedenza sul monitor della risorsa da condividere... cmq apparte queste indicazioni teoriche e basilari posso mandarti sull'esempio di microsoft: http://msdn.microsoft.com/library/ita/default.asp?url=/library/ITA/vccore/html/_core_sample_multithread_c_program.asp dove sembra che per le priorità ci sia WaitForSingleObject, sennò qualche guida si troverà.

:ciauz:

DYNAM!C+
23-06-2005, 22:11
SetThreadPriority per impostare la priorita' d'esecuzione

Loading