глюк, да еще и я туплю)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 4 Dec 2009.

  1. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    старею мля) собсна код:

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

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    Первой что вызвало подозрения, это передача адреса локальной переменной в функцию:

    Code:
    char buff[256];
    ...
    itm.pszText = buff;
    ...
    g_pDlg->m_HostList.GetItem(&itm);
    
    Правда не ясно как связаны #1 #2 с этим.
     
  3. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    вообще это мфц, но какраз нормально, тк листвью возвращает в этот буфер текст элемента с индексом i.

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

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    мдя, решилось определением host_threads типом static (в глобальной памяти), либо же как malloc(sizeof(HANDLE)*256)

    значит со стеком чтото?!
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Ну дык HANDLE host_threads[256]; у тебя локальная переменная при каждом вызове ScanThread ее адрес может меняться так ты ещё из потока создаешь потоки... в общем попробуй вынести host_threads вообще в глобальные переменные что бы все потоки могли её видеть. авось что и получится :)

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