Wątki

0

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

0

CreateThread itd
_beginthreadex itd

0

mógłbyś prosty przykład dołożyć :)

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]

0

Na www.cepa.prv.pl masz klase do tego :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1