Losowanie z wnętrza wątku


(Kjanok) #1

mam mały problem. Mam wątek, który wywołuję za pomocą funkcji _beginthread. W wątku tym muszę losować sobie liczbę z pewnego zakresu. Gdy jednak już podczas działania programu dochodzi do losowania Widnows wywala błąd... słyszałem, że wątki mogą mieć problemy z liczeniem czasu, ale może istnieje jakiś sposób, żeby temu zaradzić?

oto mój wątek

void __cdecl czasoodmierzacz(void* ptr){//-------------------------------wątek

char temp[400];

int s,t;

DIR * folder;

struct dirent *folst;

GetWindowTextA(sec, temp, 10);

s=atoi(temp);

GetWindowTextA(path,temp,400);

t=SendDlgItemMessageA(uchwytOkna,110, CB_GETCURSEL,0,0);

folder=opendir(temp);

if (!folder){MessageBox(uchwytOkna, "Podany folder nie istnieje", "ERROR!!!", MB_OK | MB_ICONWARNING); _endthread();}

if (t==0) t=1000;

else if(t==1) t=60000;

else if(t==2) t=3600000;

folst=readdir(folder);

folst=readdir(folder);

vector filenames;

string te;

while(folst=readdir(folder)){

te=folst->d_name;

if(te.rfind(".jpg")==1 || te.rfind(".bmp")==1 || te.rfind(".png")==1 || te.rfind(".gif")==1 || te.rfind(".jpeg")==1) filenames.push_back(folst->d_name);

}

int los;

srand(time(NULL));

while (true) {

Sleep(s*t);

los=rand()%filenames.size(); //--------------------------------tutaj właśnie odbywa się to losowanie

}

}

([alex]) #2

Podejrzewam że masz brak elementów w filenames, więc filenames.size() jest zerem, operacja % jest właściwie dzieleniem, czyli mówiąc wprost dzielisz przez zero.


(Sawyer47) #3

Jeszcze taka kwestia, że standardowe srand, rand, strok i jeszcze jakaś jedna lub dwie funkcje standardowe nie powinny być używane w programach wielowątkowych (bo mogą nie być reentrant i thread-safe, to już zależne od implementacji).


([alex]) #4

Na pewno nie są thread-safe, nie znam żadnego kompilatora w którym te standardowe funkcji opatrywano jakimś mutex'em owszem standard tego nie zabrania, ale skoro ja takiego nie znam to prawdopodobieństwo że kamiljano akurat na taki trafił jest prawie zerowe.

Z tym że akurat w tym programie, z tego co pojmuje, jest tylko jeden wątek losujący a aplikacja główna też nic nie losuje.

A nawet jeżeli to nic złego się nie stanie w tym akurat programie jeżeli te losowane liczby będą jeszcze trochę mniej losowe niż są beż wątków.

kamiljano , a propos, może przenieś srand(time(NULL)); gdzieś na początek main'a, będzie trochę bardziej thread-safe :smiley: