Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с потоками вызов из потока процедур определенных вне его


Страницы:   1 2

Вова ©   (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]

естественно в том же из которого идет вызов


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо