Конференция "WinAPI" » Как узнать выполняется моя функция в основной нитке...
 
  • Jolik © (13.03.08 02:03) [0]
    Как узнать выполняется моя функция в основной нитке программы или нет?

    Заранее благодарен!
  • Германн © (13.03.08 03:10) [1]

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

    А на фига?
  • Jolik © (13.03.08 03:21) [2]
    Ну чтобы проконтролировать программеров, которые будут вызывать мои функции. При написании их я руководствовался тем, что они будут вызываться из оснвной нитки (например - вызов VCL из порожденной нитки чреват крахом)
  • Сергей М. © (13.03.08 08:18) [3]
    В простейшем случае так:

    if GetCurrentThreadId <> MainThreadId then "или нет"
  • Сергей М. © (13.03.08 08:20) [4]
    Но на то он и случай, что не обязан быть закономерностью)
  • Jolik © (13.03.08 12:55) [5]
    Ок.
    Спасибо!
  • Jolik © (13.03.08 12:58) [6]
    А че может и не совпасть условие GetCurrentThreadId = MainThreadId  в основной нитке?
  • Сергей М. © (13.03.08 13:08) [7]
    Да, при определенных условиях может и не совпасть
  • Jolik © (13.03.08 13:49) [8]
    А можно поточнее - при каких. может можно про это почитать где?
  • slow!alfamoon!com (13.03.08 13:59) [9]
    Ну.... Напиши в документации об этом.
  • Сергей М. © (13.03.08 14:09) [10]

    > при каких


    Например, при загрузке библиотеки, в которой реализована твоя функция, в любом потоке, отличном от основного.
  • Leonid Troyanovsky © (13.03.08 14:46) [11]

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

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

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

    --
    Regards, LVT.
  • Leonid Troyanovsky © (13.03.08 15:05) [12]

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

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

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

    --
    Regards, LVT.
  • Сергей М. © (13.03.08 15:17) [13]

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


    А что ?
    И такое ведь не исключено)
    И, как ни вертись, а засаду [10] при этом не миновать)
    Ну разве что только переделкой "генофонда")
  • Leonid Troyanovsky © (13.03.08 15:25) [14]

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

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

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

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

    --
    Regards, LVT.
  • Jolik © (13.03.08 15:26) [15]
    Черти, совсем запутали меня ...

    Я сделал так:

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



    Всегда ли это будет работать?
    Или если какой программист вызовет в порожденном потоке функцию  у нее окажется GetCurrentThreadId = MainThreadId и все рухнет.
    или наиборот - возможна ли ситуация, что вызывают легитимно а у нитки GetCurrentThreadId <> MainThreadId ?
  • Leonid Troyanovsky © (13.03.08 15:34) [16]

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

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

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

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


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

    --
    Regards, LVT.
  • Сергей М. © (13.03.08 15:38) [17]

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


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


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


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


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


    Легитимно, в смысле, именно в основном потоке и никак не иначе ?
    Нет, такая ситуация исключена, если конечно же к этому не приложить очумелые ручки)
 
Конференция "WinAPI" » Как узнать выполняется моя функция в основной нитке...
Есть новые Нет новых   [134431   +15][b:0][p:0.001]