Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

WinAPI и потоки

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> WinAPI и потоки
Имя
Сообщение << Старые топики   Новые топики >>
WinAPI и потоки - 2006-10-21 14:30:32.470000   
nixo

Сообщений: 213
Оценки: 0
Присоединился: 2006-06-25 20:22:26
вот есть код, в котором 2 потока работают, в одном строка меняется случайным образом, а в другом она выводится. потоки работают параллельно.но почему-то у меня все время выводится одна и та же строка в консоль, хотя при трассировке там видно, что строка меняется.кто может подсказать, в чем проблема?
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
#include "stdlib.h"
CRITICAL_SECTION cs;
const int RANGE_MIN = 0;
const int RANGE_MAX = 5;
DWORD WINAPI ThreadFunc1(PVOID pvParam)  {
    char *s=(char*)pvParam;
    char *tmp=s;
    DWORD dwResult=0;
    for(int i=0;*tmp;tmp++)if((*tmp)>='A' && (*tmp)<='Z')i++;
    while(1) {
        EnterCriticalSection(&cs);
        cout<<s<<" "<<i<<endl;
        LeaveCriticalSection(&cs);
        Sleep(300);
        cout<<"Thread 1 is working…"<<endl;
    }
    return (dwResult);
}
DWORD WINAPI ThreadFunc2(PVOID pvParam) {
    char *s1="privet",*s2="hi:)!!",*s3="preved";
    DWORD dwResult=0;
    while(1) {
        int randnum = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
        EnterCriticalSection(&cs);
        switch(randnum) {
        case 0:break;
        case 1:pvParam=(void*)s1;break;
        case 2:pvParam=(void*)s2;break;
        case 3:pvParam=(void*)s3;break;
        }
        LeaveCriticalSection(&cs);
        cout<<"Thread 2 is working…"<<endl;
        Sleep(300);
    }
    return (dwResult);
}
int main(int, char**)
{
    char str[80]="Hello!";
    InitializeCriticalSection(&cs);
    HANDLE hThread1=CreateThread(NULL,0,ThreadFunc1,&str,0,0);
    HANDLE hThread2=CreateThread(NULL,0,ThreadFunc2,&str,0,0);
    Sleep(1800);
    DeleteCriticalSection(&cs);
    return 0;
}
Post #: 1
RE: WinAPI и потоки - 2006-10-21 22:09:43.053333   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
Я не читал детально код, но на вскидку…
rand()- псевдослучайная функция. Прямо зависит от системного времени.
Рассинхронизируй потоки (вставь паузу между ними при вызове).
Или должна быть функция - аналог Rendomize в Паскале
Post #: 2
RE: WinAPI и потоки - 2006-10-22 01:58:34.273333   
nixo

Сообщений: 213
Оценки: 0
Присоединился: 2006-06-25 20:22:26
а всё, я разобрался. оказывается,во всем виновата т.н. "область видимости"
Post #: 3
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> WinAPI и потоки







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.