Доброго времени суток всем!
Создаю класс, производный от CWinThread, добавляю в него большое кол-во своих функций, которые вызываю совершенно обычным образом(class.funcname), но есть функции выполнение которых занимает большой промежуток времени. Поэтому я засовываю вызов этих функций в InitInstance() и вызываю CreateThread() своего класса. Поток успешно выполняется. Но, как мне его после этого завершить? Дело в том, что существует, потребность многократно вызывать те функции(вызов которых я помещаю в InitInstance()), но поток после их выполнения продолжает существовать.
Как правильно реализовать эту задачу?
Здравствуйте, STING, Вы писали:
STI>Доброго времени суток всем! STI>Создаю класс, производный от CWinThread, добавляю в него большое кол-во своих функций, которые вызываю совершенно обычным образом(class.funcname), но есть функции выполнение которых занимает большой промежуток времени. Поэтому я засовываю вызов этих функций в InitInstance() и вызываю CreateThread() своего класса. Поток успешно выполняется. Но, как мне его после этого завершить? Дело в том, что существует, потребность многократно вызывать те функции(вызов которых я помещаю в InitInstance()), но поток после их выполнения продолжает существовать. STI>Как правильно реализовать эту задачу?
Завершить поток просто: objThread.PostThreadMessage(WM_QUIT, 0, 0);
Только вот, мне кажется, что его постоянный перезапуск будет не очень рационален. Я бы посоветовал, из InitInstance перенести необходимые функции в обработчик какого-либо (своего) сообщения, ну и когда надо выполнить эти функции посылать потоку сообщение (PostThreadMessage и не в коем случае не SendMessage, а то потеряете все преимущества паралельного потока)
Здравствуйте, molostov, Вы писали:
M>Только вот, мне кажется, что его постоянный перезапуск будет не очень рационален. Я бы посоветовал, из InitInstance перенести необходимые функции в обработчик какого-либо (своего) сообщения, ну и когда надо выполнить эти функции посылать потоку сообщение (PostThreadMessage и не в коем случае не SendMessage, а то потеряете все преимущества паралельного потока)
OK. Но подскажи как все это дело организовать. После неудачных попыток, почитал МСДН и пришел в ужас.
Здравствуйте, STING, Вы писали:
STI>Разобрался. STI>Нужно в InitInstance() потока, вызывать Run().
почти да, только следует помнить, что достаточно в InitInstance вернуть TRUE, чтобы МФС сама вызвала Run(),
илиже из InitInstance() вернуть FALSE, тогда МФС вызовет ExitInstance() из класса потока.
STI>Создаю класс, производный от CWinThread, добавляю в него большое кол-во своих функций, которые вызываю совершенно обычным образом(class.funcname), но есть функции выполнение которых занимает большой промежуток времени. Поэтому я засовываю вызов этих функций в InitInstance() и вызываю CreateThread() своего класса. Поток успешно выполняется. Но, как мне его после этого завершить? Дело в том, что существует, потребность многократно вызывать те функции(вызов которых я помещаю в InitInstance()), но поток после их выполнения продолжает существовать. STI>Как правильно реализовать эту задачу?
Правильным будет вынести "большое кол-во своих функций" в отдельный юнит или класс и юзать их и в потоке, и где бы то ни было еще... Держать поток живым только из-за того, что доступ к методам класса возможен только через объект потока?.. Очень попахивает ...бегиннерством, мягко говоря.
Если же "свои функции" реализованы как статические методы класса, то для их использования вообще не нужен объект потока — статические методы доступны вообще без создания объекта класса. Это азбука.