Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   глюк, да еще и я туплю) (https://forum.antichat.xyz/showthread.php?t=161041)

sn0w 04.12.2009 15:26

глюк, да еще и я туплю)
 
старею мля) собсна код:

Код:

//////////////////////////////////////////////////////////////////////////
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 то мессгабокс выводит нормальное значение, а если эти строки или любая одна из них остаются в работе то мессагбокс выводит пустую строку.

__mad 04.12.2009 16:02

Первой что вызвало подозрения, это передача адреса локальной переменной в функцию:

Код:

char buff[256];
...
itm.pszText = buff;
...
g_pDlg->m_HostList.GetItem(&itm);

Правда не ясно как связаны #1 #2 с этим.

sn0w 04.12.2009 16:06

вообще это мфц, но какраз нормально, тк листвью возвращает в этот буфер текст элемента с индексом i.

я не пойму и в дебаге пробовал - появилась мысль что со стеком чтото не так, но отпала

sn0w 04.12.2009 16:23

мдя, решилось определением host_threads типом static (в глобальной памяти), либо же как malloc(sizeof(HANDLE)*256)

значит со стеком чтото?!

Gar|k 05.12.2009 12:47

Ну дык HANDLE host_threads[256]; у тебя локальная переменная при каждом вызове ScanThread ее адрес может меняться так ты ещё из потока создаешь потоки... в общем попробуй вынести host_threads вообще в глобальные переменные что бы все потоки могли её видеть. авось что и получится :)

а для эксперимента можешь по выводить адреса host_threads
printf("%02X\n",&host_threads);


Время: 02:35