Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.15;
Скачать: CL | DM;

Вниз

Как узнать выполняется моя функция в основной нитке...   Найти похожие ветки 

 
Jolik ©   (2008-03-13 02:03) [0]

Как узнать выполняется моя функция в основной нитке программы или нет?

Заранее благодарен!


 
Германн ©   (2008-03-13 03:10) [1]


> Jolik ©   (13.03.08 02:03)
>
> Как узнать выполняется моя функция в основной нитке программы
> или нет?
>
>

А на фига?


 
Jolik ©   (2008-03-13 03:21) [2]

Ну чтобы проконтролировать программеров, которые будут вызывать мои функции. При написании их я руководствовался тем, что они будут вызываться из оснвной нитки (например - вызов VCL из порожденной нитки чреват крахом)


 
Сергей М. ©   (2008-03-13 08:18) [3]

В простейшем случае так:

if GetCurrentThreadId <> MainThreadId then "или нет"


 
Сергей М. ©   (2008-03-13 08:20) [4]

Но на то он и случай, что не обязан быть закономерностью)


 
Jolik ©   (2008-03-13 12:55) [5]

Ок.
Спасибо!


 
Jolik ©   (2008-03-13 12:58) [6]

А че может и не совпасть условие GetCurrentThreadId = MainThreadId  в основной нитке?


 
Сергей М. ©   (2008-03-13 13:08) [7]

Да, при определенных условиях может и не совпасть


 
Jolik ©   (2008-03-13 13:49) [8]

А можно поточнее - при каких. может можно про это почитать где?


 
slow!alfamoon!com   (2008-03-13 13:59) [9]

Ну.... Напиши в документации об этом.


 
Сергей М. ©   (2008-03-13 14:09) [10]


> при каких


Например, при загрузке библиотеки, в которой реализована твоя функция, в любом потоке, отличном от основного.


 
Leonid Troyanovsky ©   (2008-03-13 14:46) [11]


> Jolik ©   (13.03.08 03:21) [2]

> Ну чтобы проконтролировать программеров, которые будут вызывать
> мои функции.

А что за функции?
Может лучше создать объект с требуемыми методами.
В оном можно сделать и так, чтобы его методы выполнялись,
скажем, только в гуевом потоке.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-03-13 15:05) [12]


> Сергей М. ©   (13.03.08 14:09) [10]

> Например, при загрузке библиотеки, в которой реализована
> твоя функция, в любом потоке, отличном от основного.

Чего не хватает до полной нирваны функциям, интимно
общающимся с VCL и не дружащими с потоками.
Только попадания в dll :)

--
Regards, LVT.


 
Сергей М. ©   (2008-03-13 15:17) [13]


> Leonid Troyanovsky ©   (13.03.08 15:05) [12]


А что ?
И такое ведь не исключено)
И, как ни вертись, а засаду [10] при этом не миновать)
Ну разве что только переделкой "генофонда")


 
Leonid Troyanovsky ©   (2008-03-13 15:25) [14]


> Сергей М. ©   (13.03.08 15:17) [13]

> И такое ведь не исключено)

Чур меня, тьфу-тьфу.. с++

Ужасы рассказываешь, теперь не засну :)

--
Regards, LVT.


 
Jolik ©   (2008-03-13 15:26) [15]

Черти, совсем запутали меня ...

Я сделал так:

   ///  проверяем  - главная ли нитка вызывает функцию
   if GetCurrentThreadId <> MainThreadId then
     raise Exception.Create("Нельзя вызывать функцию в порожденном потоке!");


Всегда ли это будет работать?
Или если какой программист вызовет в порожденном потоке функцию  у нее окажется GetCurrentThreadId = MainThreadId и все рухнет.
или наиборот - возможна ли ситуация, что вызывают легитимно а у нитки GetCurrentThreadId <> MainThreadId ?


 
Leonid Troyanovsky ©   (2008-03-13 15:34) [16]


> Jolik ©   (13.03.08 15:26) [15]

> Черти, совсем запутали меня ...

Поклянись, что это у тебя не в длл.

>      raise Exception.Create("Нельзя вызывать функцию в порожденном
> потоке!");


Уверен, что подконтрольные программисты правильно
обрабатывают исключения?
А то они и прочесть ничего не смогут.

--
Regards, LVT.


 
Сергей М. ©   (2008-03-13 15:38) [17]


> Всегда ли это будет работать?


Ожидаемым тобой образом - нет, не всегда.


> если какой программист вызовет в порожденном потоке функцию
>  у нее окажется GetCurrentThreadId = MainThreadId и все
> рухнет.


Запросто.
VCL вообще само по себе хрупкое и нежное создание)


> возможна ли ситуация, что вызывают легитимно а у нитки GetCurrentThreadId
> <> MainThreadId ?


Легитимно, в смысле, именно в основном потоке и никак не иначе ?
Нет, такая ситуация исключена, если конечно же к этому не приложить очумелые ручки)



Страницы: 1 вся ветка

Текущий архив: 2009.02.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
3-1215246566
lod
2008-07-05 12:29
2009.02.15
Ошибка при выполнении метода post


2-1230939157
Single
2009-01-03 02:32
2009.02.15
Приведение типов


2-1231405184
FEV
2009-01-08 11:59
2009.02.15
Работает ли внешняя программа?


15-1229683512
boriskb
2008-12-19 13:45
2009.02.15
Поносов оправдан


2-1231075826
Hank
2009-01-04 16:30
2009.02.15
Как "загрузить" все поля в ADOQuery?