wielowątkowość pod c++ jak to zrobić :)

- Rejestracja:prawie 22 lata
- Ostatnio:około 8 lat
- Postów:227
0

- Rejestracja:prawie 22 lata
- Ostatnio:około 8 lat
- Postów:227
0
mógłbyś prosty przykład dołożyć :)

- Rejestracja:ponad 22 lata
- Ostatnio:ponad 19 lat
0
#define PROG2 " PROG2 -> "
#define N 10000
#define M 1024
char buffor1[6]={0};
int verify() { // weryfikuje czy na wejsciu mam same cyfry !
for(int i=0; i<6 && buffor1[i] != '\0';i++) {
if (isalpha(buffor1[i])) return 0;
}
return 1;
}
// funkcja watku
unsigned int __stdcall MyThreadProc(void* param) {
char* string = (char*)param;
char seps[] = " ,.\t;\\/:'";
char *token;
int wynik=0;
token = strtok( string, seps );
Sleep(100);
while( token != NULL )
{
wynik++;
token = strtok( NULL, seps );
Sleep(100);
}
_endthreadex(wynik);
return wynik;
}
void error(){
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
exit(1);
}
int main(int argc, char* argv[])
{
int bad = 1, ok = 1;
int liczba1, wynik=0;
// sprawdzam czy parametry nie zostaly podane juz w linii polecen
if (argc == 2) {
strcpy(buffor1, argv[1]);
ok = 0;
} else if (argc > 2) fprintf(stdout, "\n\n%sZa DUZO parametrow w linii polecen !!\n\n", PROG2);
// jesli zle podane, za malo lub za duzo ich to powtarzaj wprowadzanie parametrow
for(;bad;) {
if (ok) {
fprintf(stdout, "\n Wprowadz parametr !!\n");
fprintf(stdout, " Podaj ilosc stringow : ");
fflush(stdin);
fscanf(stdin, " %s", buffor1);
}
if (verify() && (liczba1 = atoi(buffor1))<=N && liczba1 >= 1) bad = 0;
else {
fprintf(stdout, "\n\n%sNie mozna uzywac LITER oraz 1 <= N <= %d !!\n", PROG2, N);
ok = 1;
}
}
// wypisanie wprowadzonych liczb
fprintf(stdout, "\n\n Liczba stringow do przyjecia : %d\n\n", liczba1);
// tworzeie niezbednych tabel
char **strings = (char**)malloc(liczba1*sizeof(char*));
for (int i = 0; i < liczba1; i++) {
strings[i] = (char*)calloc(M,sizeof(char));
fprintf(stdout, "\n Podaj %d string : ",i+1);
fflush(stdin);
fscanf(stdin,"%[^\n]",strings[i]);
}
HANDLE *tab2 = (HANDLE*)malloc(liczba1*sizeof(HANDLE));
// odpalanie watkow
for (i = 0; i<liczba1; i++) {
long int watek;
if((watek = _beginthreadex(NULL, 0, MyThreadProc, (LPVOID)strings[i], 0, NULL)) == -1L) {
fprintf(stdout,"\n\n" PROG2 "Nie mozna stworzyc watku !!\n\n");
exit(1);
}
tab2[i] = (HANDLE)watek;
}
// czekanie na zakonczenie sie wszystkich odpalonych watkow
for (int j = 0; j<liczba1;) {
int l = min(MAXIMUM_WAIT_OBJECTS, liczba1-j);
if(WaitForMultipleObjects( l, &tab2[j], TRUE, INFINITE) == WAIT_FAILED) error();
if (l == liczba1) break;
else j += l;
}
fprintf(stdout,"\n\n");
// zbieranie stanow koncowych i sumowanie
for(i=0; i<liczba1; i++) {
DWORD wynik;
if(!GetExitCodeThread(tab2[i], &wynik)) error();
fprintf(stdout,PROG2 "String nr.%d ma %d wyrazy !\n", i, wynik);
if (!CloseHandle(tab2[i])) error();
free(strings[i]);
}
fprintf(stdout,"\n\n");
// kasuje tablice dynamiczne
free(strings);
free(tab2);
// pausuje program
system("PAUSE");
return 0;
}
Copyrights by ME [diabel]

- Rejestracja:ponad 22 lata
- Ostatnio:około 3 godziny
0
Na www.cepa.prv.pl masz klase do tego :P