-
Как узнать выполняется моя функция в основной нитке программы или нет?
Заранее благодарен!
-
> Jolik © (13.03.08 02:03)
>
> Как узнать выполняется моя функция в основной нитке программы
> или нет?
>
>
А на фига?
-
Ну чтобы проконтролировать программеров, которые будут вызывать мои функции. При написании их я руководствовался тем, что они будут вызываться из оснвной нитки (например - вызов VCL из порожденной нитки чреват крахом)
-
В простейшем случае так:
if GetCurrentThreadId <> MainThreadId then "или нет"
-
Но на то он и случай, что не обязан быть закономерностью)
-
Ок.
Спасибо!
-
А че может и не совпасть условие GetCurrentThreadId = MainThreadId в основной нитке?
-
Да, при определенных условиях может и не совпасть
-
А можно поточнее - при каких. может можно про это почитать где?
-
Ну.... Напиши в документации об этом.
-
> при каких
Например, при загрузке библиотеки, в которой реализована твоя функция, в любом потоке, отличном от основного.
-
> Jolik © (13.03.08 03:21) [2]
> Ну чтобы проконтролировать программеров, которые будут вызывать
> мои функции.
А что за функции?
Может лучше создать объект с требуемыми методами.
В оном можно сделать и так, чтобы его методы выполнялись,
скажем, только в гуевом потоке.
--
Regards, LVT.
-
> Сергей М. © (13.03.08 14:09) [10]
> Например, при загрузке библиотеки, в которой реализована
> твоя функция, в любом потоке, отличном от основного.
Чего не хватает до полной нирваны функциям, интимно
общающимся с VCL и не дружащими с потоками.
Только попадания в dll :)
--
Regards, LVT.
-
> Leonid Troyanovsky © (13.03.08 15:05) [12]
А что ?
И такое ведь не исключено)
И, как ни вертись, а засаду [10] при этом не миновать)
Ну разве что только переделкой "генофонда")
-
> Сергей М. © (13.03.08 15:17) [13]
> И такое ведь не исключено)
Чур меня, тьфу-тьфу.. с++
Ужасы рассказываешь, теперь не засну :)
--
Regards, LVT.
-
Черти, совсем запутали меня ...
Я сделал так:
if GetCurrentThreadId <> MainThreadId then
raise Exception.Create('Нельзя вызывать функцию в порожденном потоке!');
Всегда ли это будет работать?
Или если какой программист вызовет в порожденном потоке функцию у нее окажется GetCurrentThreadId = MainThreadId и все рухнет.
или наиборот - возможна ли ситуация, что вызывают легитимно а у нитки GetCurrentThreadId <> MainThreadId ?
-
> Jolik © (13.03.08 15:26) [15]
> Черти, совсем запутали меня ...
Поклянись, что это у тебя не в длл.
> raise Exception.Create('Нельзя вызывать функцию в порожденном
> потоке!');
Уверен, что подконтрольные программисты правильно
обрабатывают исключения?
А то они и прочесть ничего не смогут.
--
Regards, LVT.
-
> Всегда ли это будет работать?
Ожидаемым тобой образом - нет, не всегда.
> если какой программист вызовет в порожденном потоке функцию
> у нее окажется GetCurrentThreadId = MainThreadId и все
> рухнет.
Запросто.
VCL вообще само по себе хрупкое и нежное создание)
> возможна ли ситуация, что вызывают легитимно а у нитки GetCurrentThreadId
> <> MainThreadId ?
Легитимно, в смысле, именно в основном потоке и никак не иначе ?
Нет, такая ситуация исключена, если конечно же к этому не приложить очумелые ручки)