|
|
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
#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 и т.п. Видимо из-за нехватки знаний. Подкскажите плиз! в каком месте руки кривые?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 20:05 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Скорее всего возможных причины две: 1. Ты создаешь в куче новый класс, но не удаляешь его (или он с самоудалением) Но этого из приведенного кода не видно. 2. (И более возможная) где-то есть статические или глобальные переменные, которые используются твоим классом, и когда стартует новый поток, старый еще не завершился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 20:22 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Да, и еще. Учти, что поток у тебя действует лишь до тех пор, пока не завершится функция StartClass(). После этого класс необходимо убить! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 20:24 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Ни правильно. Где событие старта потока ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 20:34 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Запуск: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Потоковая ф-я: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Должно помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 20:45 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 13:44 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Функцию CreateThread настоятельно не рекомендуется использовать. Использовать надо AfxBeginThread или _beginthreadex (_beginthread так же не рекомендуется) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 13:46 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Действительно, только нашел у Рихтера: NOTE: CreateTbread - это Windows-функция, создающая поток. Но никогда не вы зывайте ее, если Вы пишете код на С/С++ Вместо нее Вы должны использо вать функцию beginthreadex из библиотеки Visual С++. (Если Вы работаете с другим компилятором, он должен поддерживать свой эквивалент функции CreateThread.) Что именно делает _beginthreadex и почему это так важно, я объясню потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 14:39 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Кроме того Рихтер пишет: В библиотеке С/С++ содержится две функции: unsigned long _beginthread( void (__cdecl *stait_address)(void *), unsigned stack_size, void *arglist); и void _endthread(void); Далее он описывает причины по которым не следует использовать эти функции, ввиду большого объема не цитирую. На этом всем спасибо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 15:17 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Tubrik, он как раз пишет все наоборот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 15:45 |
|
||
|
!!! Помогите с потоками CreateThread !!!
|
|||
|---|---|---|---|
|
#18+
Alexey-MTubrik, он как раз пишет все наоборот пишет он все правильно, если конечно не хочется заработать геморрой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 15:49 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=347&tid=2030976]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 356ms |

| 0 / 0 |
