powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / !!! Помогите с потоками CreateThread !!!
12 сообщений из 12, страница 1 из 1
!!! Помогите с потоками CreateThread !!!
    #33801096
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
#include "stdafx.h"
#include "SocksHead.h"

DWORD WINAPI NewThread(LPVOID);

int _tmain(int argc, char* argv[])
{
const int objCount = 30;//чем кол-во, тем реже вылетает

DWORD thID;

for (u_int i = 0; i <objCount; i++)
{
CreateThread(NULL, NULL, NewThread, NULL, NULL, &thID);
cout << endl << i;
Sleep(10);// чем боьше задержка, тем реже вылетает
}

cout << endl << "End..." << endl;
getch();
return 0;
}

DWORD WINAPI NewThread(LPVOID)//поток
{
//cout << endl << "New thread has been created!" << endl;

CSocksActive *tSocksPtr;
tSocksPtr = new CSocksActive(666, "192.168.0.33");
tSocksPtr->StartClass();

return 0;
}

Недавно за них взялся поэтому ничего не пойму.
Должен создаваться новый объект класса в каждом потоке, подключаться к серверу и ожидать данных. При тестировании без потоков - все прекрасно.
С потоками вылетает в самых разных местах: в dbgheap.c, в xlocale, в strlen и т.п.
Видимо из-за нехватки знаний. Подкскажите плиз! в каком месте руки кривые??
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33801122
AlexSar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее всего возможных причины две:
1. Ты создаешь в куче новый класс, но не удаляешь его (или он с самоудалением) Но этого из приведенного кода не видно.
2. (И более возможная) где-то есть статические или глобальные переменные, которые используются твоим классом, и когда стартует новый поток, старый еще не завершился.
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33801125
AlexSar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и еще.
Учти, что поток у тебя действует лишь до тех пор, пока не завершится функция StartClass(). После этого класс необходимо убить!
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33801140
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни правильно. Где событие старта потока ?
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33801152
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запуск:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 HANDLE hTStart;

void TStart()
{
TPRMCMD * cmdSet = new TPRMCMD;  
  HANDLE hThread = (HANDLE)_beginthreadex( NULL,  0 , &AsyncRun, (void*)cmdSet,  0 , NULL );  
      WaitForSingleObject(hTStart, INFINITE);
}


Потоковая ф-я:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
unsigned __stdcall   AsyncRun (LPVOID pTPrms)  
  {  
      TPRMCMD *TCmdSet = new TPRMCMD; 
      memcpy(TCmdSet,(TPRMCMD*)pTPrms,sizeof(TPRMCMD));   
      SetEvent (hTStart);  
   ....
  _endthreadex( 0 );  
  return  0 ;  
  }

Должно помочь.
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33802488
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSarСкорее всего возможных причины две:
1. Ты создаешь в куче новый класс, но не удаляешь его (или он с самоудалением) Но этого из приведенного кода не видно.
2. (И более возможная) где-то есть статические или глобальные переменные, которые используются твоим классом, и когда стартует новый поток, старый еще не завершился.

Действиетльно есть статические переменные в одной функции класса(глобальных нет). Действительно и то, что кадждый новый поток стартует не дожидаясь завершения другого, т.к. приложение многопоточное и должно создавать сразу несколько подключений к серверу.

for (u_int i = 0; i <objCount; i++)
{
CreateThread(NULL, NULL, NewThread, NULL, NULL, &thID);
cout << endl << i;
Sleep(10);// чем боьше задержка, тем реже вылетает
}

Но для каждого потока создается новый объект класса:

CSocksActive *tSocksPtr;
tSocksPtr = new CSocksActive(666, "192.168.0.33");
tSocksPtr->StartClass();

Т.е. общих ресурсов у потоков быть не должно. И еще хотелось понять в чем ошибка с CreateThread, если не разберусь, буду юзать _beginthreadex
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33802495
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функцию CreateThread настоятельно не рекомендуется использовать. Использовать надо AfxBeginThread или _beginthreadex (_beginthread так же не рекомендуется)
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33802721
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, только нашел у Рихтера:
NOTE:
CreateTbread - это Windows-функция, создающая поток. Но никогда не вы зывайте ее, если Вы пишете код на С/С++ Вместо нее Вы должны использо вать функцию beginthreadex из библиотеки Visual С++. (Если Вы работаете с другим компилятором, он должен поддерживать свой эквивалент функции CreateThread.) Что именно делает _beginthreadex и почему это так важно, я объясню потом.
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33802943
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того Рихтер пишет:

В библиотеке С/С++ содержится две функции:

unsigned long _beginthread( void (__cdecl *stait_address)(void *), unsigned stack_size, void *arglist);

и

void _endthread(void);

Далее он описывает причины по которым не следует использовать эти функции, ввиду большого объема не цитирую.

На этом всем спасибо)
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33803077
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik, он как раз пишет все наоборот
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33803094
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey-MTubrik, он как раз пишет все наоборот
пишет он все правильно, если конечно не хочется заработать геморрой...
...
Рейтинг: 0 / 0
!!! Помогите с потоками CreateThread !!!
    #33803170
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гемороя и так пока хватает.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / !!! Помогите с потоками CreateThread !!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]