![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать выполняется моя функция в основной нитке...
Jolik © (2008-03-13 02:03:00)Как узнать выполняется моя функция в основной нитке программы или нет?
Заранее благодарен!
Сергей М. (2008-03-13 15:38:00) [1]
> Всегда ли это будет работать?
Ожидаемым тобой образом - нет, не всегда.
> если какой программист вызовет в порожденном потоке функцию
> у нее окажется GetCurrentThreadId = MainThreadId и все
> рухнет.
Запросто.
VCL вообще само по себе хрупкое и нежное создание)
> возможна ли ситуация, что вызывают легитимно а у нитки GetCurrentThreadId
> <> MainThreadId ?
Легитимно, в смысле, именно в основном потоке и никак не иначе ?
Нет, такая ситуация исключена, если конечно же к этому не приложить очумелые ручки)
Leonid Troyanovsky (2008-03-13 15:34:00) [2]
> Jolik © (13.03.08 15:26) [15]
> Черти, совсем запутали меня ...
Поклянись, что это у тебя не в длл.
> raise Exception.Create('Нельзя вызывать функцию в порожденном
> потоке!');
Уверен, что подконтрольные программисты правильно
обрабатывают исключения?
А то они и прочесть ничего не смогут.
--
Regards, LVT.
Jolik (2008-03-13 15:26:00) [3]Черти, совсем запутали меня ...
Я сделал так:
/// проверяем - главная ли нитка вызывает функцию
if GetCurrentThreadId <> MainThreadId then
raise Exception.Create('Нельзя вызывать функцию в порожденном потоке!');
Всегда ли это будет работать?
Или если какой программист вызовет в порожденном потоке функцию у нее окажется GetCurrentThreadId = MainThreadId и все рухнет.
или наиборот - возможна ли ситуация, что вызывают легитимно а у нитки GetCurrentThreadId <> MainThreadId ?
Leonid Troyanovsky (2008-03-13 15:25:00) [4]
> Сергей М. © (13.03.08 15:17) [13]
> И такое ведь не исключено)
Чур меня, тьфу-тьфу.. с++
Ужасы рассказываешь, теперь не засну :)
--
Regards, LVT.
Сергей М. (2008-03-13 15:17:00) [5]
> Leonid Troyanovsky © (13.03.08 15:05) [12]
А что ?
И такое ведь не исключено)
И, как ни вертись, а засаду [10] при этом не миновать)
Ну разве что только переделкой "генофонда")
Leonid Troyanovsky (2008-03-13 15:05:00) [6]
> Сергей М. © (13.03.08 14:09) [10]
> Например, при загрузке библиотеки, в которой реализована
> твоя функция, в любом потоке, отличном от основного.
Чего не хватает до полной нирваны функциям, интимно
общающимся с VCL и не дружащими с потоками.
Только попадания в dll :)
--
Regards, LVT.
Leonid Troyanovsky (2008-03-13 14:46:00) [7]
> Jolik © (13.03.08 03:21) [2]
> Ну чтобы проконтролировать программеров, которые будут вызывать
> мои функции.
А что за функции?
Может лучше создать объект с требуемыми методами.
В оном можно сделать и так, чтобы его методы выполнялись,
скажем, только в гуевом потоке.
--
Regards, LVT.
Сергей М. (2008-03-13 14:09:00) [8]
> при каких
Например, при загрузке библиотеки, в которой реализована твоя функция, в любом потоке, отличном от основного.
slow!alfamoon!com (2008-03-13 13:59:00) [9]Ну.... Напиши в документации об этом.
Jolik (2008-03-13 13:49:00) [10]А можно поточнее - при каких. может можно про это почитать где?
Сергей М. (2008-03-13 13:08:00) [11]Да, при определенных условиях может и не совпасть
Jolik (2008-03-13 12:58:00) [12]А че может и не совпасть условие GetCurrentThreadId = MainThreadId в основной нитке?
Jolik (2008-03-13 12:55:00) [13]Ок.
Спасибо!
Сергей М. (2008-03-13 08:20:00) [14]Но на то он и случай, что не обязан быть закономерностью)
Сергей М. (2008-03-13 08:18:00) [15]В простейшем случае так:
if GetCurrentThreadId <> MainThreadId then "или нет"
Jolik (2008-03-13 03:21:00) [16]Ну чтобы проконтролировать программеров, которые будут вызывать мои функции. При написании их я руководствовался тем, что они будут вызываться из оснвной нитки (например - вызов VCL из порожденной нитки чреват крахом)
Германн (2008-03-13 03:10:00) [17]
> Jolik © (13.03.08 02:03)
>
> Как узнать выполняется моя функция в основной нитке программы
> или нет?
>
>
А на фига?