старею мля) собсна код: Code: ////////////////////////////////////////////////////////////////////////// DWORD WINAPI ScanThread(LPVOID param) { int nItems; char buff[256]; char mac[256]; DWORD tid; HANDLE host_threads[256]; //maximum for the subnet (C class) LVITEM itm; PARAM_BLOCK *preq_data; nItems = g_pDlg->m_HostList.GetItemCount(); if(nItems > 256){ MessageBox(0, "Maximum host number exceeded! (256). Check mping.txt", 0, 0); return 0; } // fillup info & spawn threads for(int i=0; i< nItems; i++){ itm.cchTextMax = sizeof(buff); itm.pszText = buff; itm.mask = LVIF_TEXT; itm.iItem = i; g_pDlg->m_HostList.GetItem(&itm); MessageBox(0,buff,0,0); preq_data = (PARAM_BLOCK*)malloc(sizeof(PARAM_BLOCK)); preq_data->dst = inet_addr(buff); preq_data->src = INADDR_ANY;//inet_addr("192.168.1.16"); // need to be fixed preq_data->data_len = sizeof(preq_data->mac_data); preq_data->idx = i; host_threads[i] = CreateThread(0,0,ARPThread,preq_data,0,&tid); // problem #1 } WaitForMultipleObjects(nItems, host_threads, 1, INFINITE); // problem #2 return 0; } чето не могу понять. если закомментить строки с проблем #1 и #2 то мессгабокс выводит нормальное значение, а если эти строки или любая одна из них остаются в работе то мессагбокс выводит пустую строку.
Первой что вызвало подозрения, это передача адреса локальной переменной в функцию: Code: char buff[256]; ... itm.pszText = buff; ... g_pDlg->m_HostList.GetItem(&itm); Правда не ясно как связаны #1 #2 с этим.
вообще это мфц, но какраз нормально, тк листвью возвращает в этот буфер текст элемента с индексом i. я не пойму и в дебаге пробовал - появилась мысль что со стеком чтото не так, но отпала
мдя, решилось определением host_threads типом static (в глобальной памяти), либо же как malloc(sizeof(HANDLE)*256) значит со стеком чтото?!
Ну дык HANDLE host_threads[256]; у тебя локальная переменная при каждом вызове ScanThread ее адрес может меняться так ты ещё из потока создаешь потоки... в общем попробуй вынести host_threads вообще в глобальные переменные что бы все потоки могли её видеть. авось что и получится а для эксперимента можешь по выводить адреса host_threads printf("%02X\n",&host_threads);