CreateThread
От: Аноним  
Дата: 29.01.10 15:43
Оценка:
Вот эта функция у меня нормально выполняется, то есть — запускается тред MyFunction и работает

myl = CreateThread(lpThreadAttributes, 0, MyFunction, Null, 0, lpThreadId)


но — любой код после этой строчки — не выполняется, как будто его нет и в помине! В чем ошибка у меня не могу понять? А если я, например, хочу написать еще одно создание треда непосредственно после первого,
myl = CreateThread(lpThreadAttributes, 0, MyOtherFunction, Null, 0, lpThreadId)


а он не исполняется, то как быть?

01.02.10 22:27: Перенесено модератором из 'WIN API' — Кодт
Re: CreateThread
От: Сергей Мухин Россия  
Дата: 29.01.10 15:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот эта функция у меня нормально выполняется, то есть — запускается тред MyFunction и работает


А>
А>myl = CreateThread(lpThreadAttributes, 0, MyFunction, Null, 0, lpThreadId)
А>


А>но — любой код после этой строчки — не выполняется, как будто его нет и в помине! В чем ошибка у меня не могу понять? А если я, например, хочу написать еще одно создание треда непосредственно после первого,

А>
А>myl = CreateThread(lpThreadAttributes, 0, MyOtherFunction, Null, 0, lpThreadId)
А>


А>а он не исполняется, то как быть?


ищите ошибку, Вы же понимаете, что она у Вас, а не в CreateThread. Или приведите побольше кода.
Например, как узнали, что не выполняется? мб thread завершил уже приложение. Тогда и не выполниться
---
С уважением,
Сергей Мухин
Re[2]: CreateThread
От: Огнеплюх  
Дата: 29.01.10 18:38
Оценка: +1
Здравствуйте, Сергей Мухин, Вы писали:
А>>
А>>myl = CreateThread(lpThreadAttributes, 0, MyOtherFunction, Null, 0, lpThreadId)
А>>


А>>а он не исполняется, то как быть?

А что такое lpThreadAttributes, lpThreadId ? Попробуй нули поставить.
Re[2]: CreateThread
От: Аноним  
Дата: 30.01.10 09:09
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>ищите ошибку, Вы же понимаете, что она у Вас, а не в CreateThread. Или приведите побольше кода.

СМ>Например, как узнали, что не выполняется? мб thread завершил уже приложение. Тогда и не выполниться

В этом создаваемом треде, в функции MyFunction, у меня бесконечный цикл, так задумано и нужно, тред нормально запускается-работает,я же говорю -любой код после этой указанной выше строки создания треда НЕ ВЫПОЛНЯЕТСЯ, что бы ни было, так и проверил — написал после этой строки разные команды — до них дело не доходит, как будто их и нет! Какой бы ни был код в MyFunction — без разницы, функция Main, после CreateThread, заканчивается (или даже не знаю, что с ней происходит), но CreateThread — все равно должен быть в Main последней командой!
Re[3]: CreateThread
От: Аноним  
Дата: 30.01.10 09:16
Оценка:
Здравствуйте, Огнеплюх, Вы писали:

А>>>а он не исполняется, то как быть?

О>А что такое lpThreadAttributes, lpThreadId ? Попробуй нули поставить.
Соответственно — указатель на структуру и на идентификатор треда, по параметрам функции, как и требуется, нули ставил — не работает с ними!
Re: CreateThread
От: fkRTTI  
Дата: 30.01.10 12:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот эта функция у меня нормально выполняется, то есть — запускается тред MyFunction и работает


А>
А>myl = CreateThread(lpThreadAttributes, 0, MyFunction, Null, 0, lpThreadId)
А>


А>но — любой код после этой строчки — не выполняется, как будто его нет и в помине! В чем ошибка у меня не могу понять? А если я, например, хочу написать еще одно создание треда непосредственно после первого,

А>
А>myl = CreateThread(lpThreadAttributes, 0, MyOtherFunction, Null, 0, lpThreadId)
А>


А>а он не исполняется, то как быть?


Так будет работать 100%

DWORD dwThreadId1, dwThreadId2;

HANDLE thread1 = CreateThread(NULL, 0, MyFunction, Null, 0, &dwThreadId1);
HANDLE thread2 = CreateThread(NULL, 0, MyOtherFunction, Null, 0, &dwThreadId2);
Re[3]: CreateThread
От: Сергей Мухин Россия  
Дата: 30.01.10 14:38
Оценка:
Здравствуйте, Аноним, Вы писали:

СМ>>Например, как узнали, что не выполняется? мб thread завершил уже приложение. Тогда и не выполниться


А>В этом создаваемом треде, в функции MyFunction, у меня бесконечный цикл, так задумано и нужно, тред нормально запускается-работает,я же говорю -любой код после этой указанной выше строки создания треда НЕ ВЫПОЛНЯЕТСЯ, что бы ни было, так и проверил — написал после этой строки разные команды — до них дело не доходит, как будто их и нет! Какой бы ни был код в MyFunction — без разницы, функция Main, после CreateThread, заканчивается (или даже не знаю, что с ней происходит), но CreateThread — все равно должен быть в Main последней командой!


Ничего не понял, какие команды? я не помню, что бы в С/C++ были команды.
Может просто в отладчике точку останова поставить?

Можно просто привести маленький пример? на котором бы проявилось все коварство CreateThread?

Может надо поставить ожидание после CreateThread? Например WaitForSingleObject?
---
С уважением,
Сергей Мухин
Re[2]: CreateThread
От: Аноним  
Дата: 31.01.10 16:03
Оценка:
Здравствуйте, fkRTTI, Вы писали:
http://www.rsdn.ru/
RTT>Так будет работать 100%

RTT>
RTT>DWORD dwThreadId1, dwThreadId2;

RTT>HANDLE thread1 = CreateThread(NULL, 0, MyFunction, Null, 0, &dwThreadId1);
RTT>HANDLE thread2 = CreateThread(NULL, 0, MyOtherFunction, Null, 0, &dwThreadId2);
RTT>


Хм, вообще-то я привел функцию Win API для Visual Basic-а, я пробовал myl = CreateThread(Null, 0, MyFunction, Null, 0, lpThreadId) — не работало, только мой вариант сработал, но и тогда, все равно, после CreateThread, ни одна функция,господин Мухин, любая, какая только вам в голову придет — не выполняется и никакие точки останова не влияют и не помогают делу! Я разве неясно говорю?, у меня "CreateThread" нормально выпоняется, я на него не жалуюсь, я жалуюсь, что ПОСЛЕ этой функции ничего не выполняется (в том числе и еще один CreateThread)!!! Ой, мама...
Re[3]: CreateThread
От: ononim  
Дата: 31.01.10 16:20
Оценка:
RTT>>HANDLE thread1 = CreateThread(NULL, 0, MyFunction, Null, 0, &dwThreadId1);
А>Хм, вообще-то я привел функцию Win API для Visual Basic-а, я пробовал myl = CreateThread(Null, 0, MyFunction, Null, 0, lpThreadId) — не работало, только мой вариант сработал, но и тогда, все равно, после CreateThread, ни одна функция,господин Мухин, любая, какая только вам в голову придет — не выполняется и никакие точки останова не влияют и не помогают делу! Я разве неясно говорю?, у меня "CreateThread" нормально выпоняется, я на него не жалуюсь, я жалуюсь, что ПОСЛЕ этой функции ничего не выполняется (в том числе и еще один CreateThread)!!! Ой, мама...
меня терзают смутные сомнения по поводу вижуал бейсика... а не нужно ли в нем случайно явно брать указатель от функции?
Как много веселых ребят, и все делают велосипед...
Re[3]: CreateThread
От: Сергей Мухин Россия  
Дата: 31.01.10 16:27
Оценка:
Здравствуйте, Аноним, Вы писали:

>Ой, мама...


Как я понял, примера, как этот эффект проявляется так и не будет.
---
С уважением,
Сергей Мухин
Re[4]: CreateThread
От: Аноним  
Дата: 01.02.10 14:53
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Как я понял, примера, как этот эффект проявляется так и не будет.


Уважаемый господин Сергей Мухин, вот например такая последоватрельность функций в проекте Visual Basic-а:
myl = CreateThread(lpThreadAttributes, 0, MyFunction, Null, 0, lpThreadId)
myl = CreateThread(lpThreadAttributes, 0, MyOtherFunction, Null, 0, lpThreadId)


Поставьте точку останова на второй функции — и дождитесь дойдет ли до нее очередь. MyFunction и MyOtherFunction можно сделать пустышками — это не имеет значения,все равно до второго CreateThread-а дело не дойдет (запустится только MyFunction). Надеюсь, достаточно?
Re[4]: CreateThread
От: Аноним  
Дата: 01.02.10 14:58
Оценка:
Здравствуйте, ononim, Вы писали:

O>меня терзают смутные сомнения по поводу вижуал бейсика... а не нужно ли в нем случайно явно брать указатель от функции?


Зачем и как брать еще явнее? MyFunction выполняется, не выполняется СЛЕДУЮЩИЙ идентичный запуск треда с точно такой же как MyFunction -МyOtherFunction! Да и вообще любая другая функция после функции myl = CreateThread(ThreadAttributes, 0, MyFunction, Null, 0, ThreadId) ме выполняется!!!
Re[5]: CreateThread
От: Сергей Мухин Россия  
Дата: 01.02.10 15:02
Оценка:
Здравствуйте, Аноним, Вы писали:

СМ>>Как я понял, примера, как этот эффект проявляется так и не будет.


А>Уважаемый господин Сергей Мухин, вот например такая последоватрельность функций в проекте Visual Basic-а:

А>
А>myl = CreateThread(lpThreadAttributes, 0, MyFunction, Null, 0, lpThreadId)
А>myl = CreateThread(lpThreadAttributes, 0, MyOtherFunction, Null, 0, lpThreadId)
А>


А>Поставьте точку останова на второй функции — и дождитесь дойдет ли до нее очередь. MyFunction и MyOtherFunction можно сделать пустышками — это не имеет значения,все равно до второго CreateThread-а дело не дойдет (запустится только MyFunction). Надеюсь, достаточно?


Вы странный однако, Вас уже четвертый раз просят пример , а Вы куски показываете.
Я взял эти две строки и они выдали мне куча ошибок. У меня нет времени что бы разбираться в них приведите, так что бы воспроизводилось, и вас помогут.

Error 1 Name 'myl' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 5 9 ConsoleApplication1
Error 2 Name 'CreateThread' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 5 15 ConsoleApplication1
Error 3 Name 'lpThreadAttributes' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 5 28 ConsoleApplication1
Error 4 Name 'MyFunction' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 5 51 ConsoleApplication1
Error 5 'Null' is not declared. 'Null' constant is no longer supported; use 'System.DBNull' instead. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 5 63 ConsoleApplication1
Error 6 Name 'lpThreadId' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 5 72 ConsoleApplication1
Error 7 Name 'myl' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 6 9 ConsoleApplication1
Error 8 Name 'CreateThread' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 6 15 ConsoleApplication1
Error 9 Name 'lpThreadAttributes' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 6 28 ConsoleApplication1
Error 10 Name 'MyOtherFunction' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 6 51 ConsoleApplication1
Error 11 'Null' is not declared. 'Null' constant is no longer supported; use 'System.DBNull' instead. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 6 68 ConsoleApplication1
Error 12 Name 'lpThreadId' is not declared. d:\pdc\VVVVV\ConsoleApplication1\ConsoleApplication1\Module1.vb 6 77 ConsoleApplication1
---
С уважением,
Сергей Мухин
Re[5]: CreateThread
От: ononim  
Дата: 01.02.10 15:14
Оценка: +1
O>>меня терзают смутные сомнения по поводу вижуал бейсика... а не нужно ли в нем случайно явно брать указатель от функции?
А>Зачем и как брать еще явнее? MyFunction выполняется, не выполняется СЛЕДУЮЩИЙ идентичный запуск треда с точно такой же как MyFunction -МyOtherFunction! Да и вообще любая другая функция после функции myl = CreateThread(ThreadAttributes, 0, MyFunction, Null, 0, ThreadId) ме выполняется!!!
Затем что быть может в вашем случае происходит вызов MyFunction, затем запуск потока с start routine — то что вернула MyFunction. В данном случае поскольку MyFunction работает вечно вы получаете затык. В противном случае с большой вероятностью получите крэш после завершения MyFunction.
Я конечно в VB ни бум-бум, но сдается мне то, что указание MyFunction без скобочек является аналогом указателя на функцию в C++ отнюдь не факт что распространяется на VB
Как много веселых ребят, и все делают велосипед...
Re[6]: CreateThread
От: Were  
Дата: 01.02.10 15:28
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>меня терзают смутные сомнения по поводу вижуал бейсика... а не нужно ли в нем случайно явно брать указатель от функции?

А>>Зачем и как брать еще явнее? MyFunction выполняется, не выполняется СЛЕДУЮЩИЙ идентичный запуск треда с точно такой же как MyFunction -МyOtherFunction! Да и вообще любая другая функция после функции myl = CreateThread(ThreadAttributes, 0, MyFunction, Null, 0, ThreadId) ме выполняется!!!
O>Затем что быть может в вашем случае происходит вызов MyFunction, затем запуск потока с start routine — то что вернула MyFunction. В данном случае поскольку MyFunction работает вечно вы получаете затык. В противном случае с большой вероятностью получите крэш после завершения MyFunction.
O>Я конечно в VB ни бум-бум, но сдается мне то, что указание MyFunction без скобочек является аналогом указателя на функцию в C++ отнюдь не факт что распространяется на VB

Гугл говорит, надо делать так:

myl = CreateThread(ThreadAttributes, 0, AddressOf MyFunction, Null, 0, ThreadId)
Re[7]: CreateThread
От: ZAMUNDA Земля для жалоб и предложений
Дата: 02.02.10 13:41
Оценка:
Здравствуйте, Were, Вы писали:

W>Гугл говорит, надо делать так:


W>
W>myl = CreateThread(ThreadAttributes, 0, AddressOf MyFunction, Null, 0, ThreadId)
W>

Ну если про VB6, то надо так:
myl = CreateThread(ThreadAttributes, 0, AddressOf MyFunction, 0, 0, ThreadId)

и надо правильно объявить CreateThread. Ну раз автор код не показывает, то ничё подробнее сказать не могу. Null это VARIANT с .vt = VT_NULL
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[6]: CreateThread
От: Аноним  
Дата: 02.02.10 19:18
Оценка:
Здравствуйте, ononim, Вы писали:


O>Затем что быть может в вашем случае происходит вызов MyFunction, затем запуск потока с start routine — то что вернула MyFunction. В данном случае поскольку MyFunction работает вечно вы получаете затык. В противном случае с большой вероятностью получите крэш после завершения MyFunction.

O>Я конечно в VB ни бум-бум, но сдается мне то, что указание MyFunction без скобочек является аналогом указателя на функцию в C++ отнюдь не факт что распространяется на VB

Давно хочу поблагодарить Вас, ononim, за вашу светлую голову, мне думается, вы правы насчет "затыка", я — типичный идиот, не подумал и машинально не обратил внимания на такую "мелочь" — что неверно ждать возврата от моей "вечной" MyFunction! Крэша вроде пока не было, но убить мой процесс во время logoff-a компа, при моей безмозглой "реализации", не получится, а после вашего верного замечания наверняка все получится! Спасибо вашим маме и папе, что подарили нам Вас, ononim!
П.С.
Я не корифей VB, но как раз скобочки вроде указатель функции бы и предполагали, а я лишь должен был написать
CreateThread  ThreadAttributes, 0, MyFunction, Null, 0, ThreadId

вроде того...
Were i Zamunda, AddressOf здесь не нужен, вроде я пробовал — тогда ошибку дает...


П.П.С.
Сергей Мухин — спасибо за муки творчества,признателен за внимание! Я не привожу Declare, ибо как и все копирую WIN API, как и должно!
Всем — спасибо за участие!
Re[7]: CreateThread
От: ZAMUNDA Земля для жалоб и предложений
Дата: 02.02.10 21:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Were i Zamunda, AddressOf здесь не нужен, вроде я пробовал — тогда ошибку дает... :(

Не может такого быть. Не пробовали вы ничего, если такое говорите.

А>Сергей Мухин — спасибо за муки творчества,признателен за внимание!:) Я не привожу Declare, ибо как и все копирую WIN API, как и должно!

В MSDN приведены декларации на C, и неправильный перевод их на VB это самая частая ошибка. Даже базы с готовыми декларациями, которыми вам стоило бы воспользоваться (ApiViewer 200x например), не всегда верны.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[7]: CreateThread
От: ononim  
Дата: 03.02.10 00:23
Оценка:
А>П.С.
А>Я не корифей VB, но как раз скобочки вроде указатель функции бы и предполагали, а я лишь должен был написать
А>
А>CreateThread  ThreadAttributes, 0, MyFunction, Null, 0, ThreadId 
А>

не ну етоже п..ц какой то. Я не эти скобки имел ввиду.
В С++ — MyFunction() — это вызов MyFunction. MyFunction — это указатель на MyFunction, тоже самое что &MyFunction.
В VB, по моим смутным воспоминаниям QBasic'а — MyFunction — это вызов MyFunction. Значит должен быть некий оператор указателя чтобы взять указатель, ибо написание имени функции в нем это ее вызов.
Как много веселых ребят, и все делают велосипед...
Re[8]: CreateThread
От: Сергей Мухин Россия  
Дата: 03.02.10 05:23
Оценка:
Здравствуйте, ZAMUNDA, Вы писали:

ZAM>Здравствуйте, Аноним, Вы писали:


А>>Were i Zamunda, AddressOf здесь не нужен, вроде я пробовал — тогда ошибку дает...

ZAM>Не может такого быть. Не пробовали вы ничего, если такое говорите.

А>>Сергей Мухин — спасибо за муки творчества,признателен за внимание! Я не привожу Declare, ибо как и все копирую WIN API, как и должно!

ZAM>В MSDN приведены декларации на C, и неправильный перевод их на VB это самая частая ошибка. Даже базы с готовыми декларациями, которыми вам стоило бы воспользоваться (ApiViewer 200x например), не всегда верны.

Короче. На будущее. Если хотите чтобы Вам помогли быстро — выдавайте весь проблемный текст. Можно его конечно минимизировать, и часто, при минимизации люди сами находят ошибки

Удачи
---
С уважением,
Сергей Мухин
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.