![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с потоками вызов из потока процедур определенных вне его
Вова © (2013-06-02 21:23:00)Есть класс TThread. И есть некоторые функции объявленные вне этого класса (т.е. вообще не в классе). Вопрос - что происходит, когда я вызываю их из TThread(т.е. в одной из процедур этого класса)? В частности интересуют, выполняются ли они прямо в этом же потоке, или они выполняются на стороне основного потока?
Германн (2013-06-03 02:18:00) [21]
> Вова (03.06.13 01:12) [4]
>
> эх, тогда я никак не могу понять, почему программа повисает
У тебя есть под руками код программы и отладчик. У нас под руками только отладчик. Что ты хочешь получить от нас? Когда наши программы "повисают", то мы ищем в них ошибку. Чаще всего с помощью отладчика.
Вова (2013-06-03 01:40:00) [22]нет, и все таки нихрена не работат :-|
Вова (2013-06-03 01:12:00) [23]эх, тогда я никак не могу понять, почему программа повисает на одном из (все время на разных) WaitForSingleObject(MyMutex, INFINITE); - если сделать ожидание не бесконечным, то ошибка "Invalid Handle". Причем виснут оба потока. Но TThread никогда не обращается в основной поток, если не считать за обращение вызов вот этих функций объявленных не в классе( они вызываются из процедур вызваных из Execute). В этих функциях кстати есть создание объектов TBitmap, и при этом в них используется bmp.Canvas.Lock/Unlock; а также получение скриншота, может в этот момент он лезет в основной поток? или я уже не знаю что копать, где искать.
Как временное решение это если INFINITE заменить на цифру, и сделать обработку ошибки, то в принципе работает, но как то это неправильно. Может есть идеи?
Медвежонок Пятачок (2013-06-02 23:16:00) [24]да нет разницы.
вызываешь из конструктора - будет выполнено в том же потоке что и конструктор, то есть в потоке, создавшем нить.
вызовешь из execute - будет выполнено из того же самого потока в котором выполняется сам execute, то есть во вторичном.
остальные случаи типа синхронайза не рассматриваем, так как там нет никакого вызова, а есть запихивание в очередь.
DVM (2013-06-02 23:04:00) [25]
> Вопрос - что происходит, когда я вызываю их из TThread(т.
> е. в одной из процедур этого класса)?
Смотря из какого метода. И смотря как этот метод вызывался сам.
Чтобы некий код был выполнен в контексте потока, порожденного классом TThread надо, чтобы этот код вызван явно или косвенно из метода TThread.Execute и никак иначе.
Медвежонок Пятачок (2013-06-02 22:49:00) [26]естественно в том же из которого идет вызов