Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread - как остановить? 
:(
    Опции темы
Nuzur
Дата 12.1.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Я создаю поток HCOM1 = AfxBeginThread(COM1, this);
как потом его остановиьть чтобы неюыло ликов?
Поток должен выполняться на протяжении всей роботы программы.


--------------------
Never again...
PM MAIL   Вверх
Coocky
Дата 12.1.2005, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Неь,нужно прописать что-то типа AutoDelete///Короче посмотрю,а то не помню...Ну если раньше не ответят.. smile
Вообще-то посмотри МСДН про потоки в МФС там есть smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
S.A.P.
Дата 12.1.2005, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



Что у тебя означает COM1. По идее это должен быть объект - наследник класса CWinThread, тогда глюков быть не должно.
PM MAIL   Вверх
En_t_end
Дата 13.1.2005, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



А глюки будут, так как с этого дня ты узреешь, что в С++ надо обязательно уничтожать обьекты памяти, особенно при работе с потоками и при их многоразовом использовании smile smile
Вот это ссылка тебе возможно поможет :
http://forum.vingrad.ru/index.php?showtopic=38847
А вообще тебе надо именно приостановить ?(для таких случаев имхо suspendthread смотри) или остановить, поменять значения для потока, а потом запустить ? - вот если так, то по той ссылке тебе обязательно надо сходить!
PM MAIL ICQ Skype GTalk Jabber   Вверх
Nuzur
Дата 13.1.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Фунция, простите поток, обьявлен у меня так
Добавлено @ 17:33
Фунция, простите поток, обьявлен у меня так
UINT Stream(LPVOID Param)

Дело в том что он должен просматривать очередь и если она не пуста то выполнять там определенные действий, а при закрытии программы вызываеться деструктор очередь, ну и должен закрыться поток.



--------------------
Never again...
PM MAIL   Вверх
S.A.P.
Дата 13.1.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



Какой смысл тебе использовать MFC функции, когда та не создаешь объект класса CWinThread?.
Делай на API, вот пример:

Код

// объявляем поток, простите функцию
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
   // тут наш поток

   return 0;
}

. . . . . .    

DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;

hThread = CreateThread(NULL, 0, ThreadFunc, &dwThrdParam, 0, &dwThreadId);

// продолжаем работать      

. . . . . .

CloseHandle( hThread ); // завершаем        


PM MAIL   Вверх
En_t_end
Дата 13.1.2005, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Да WinApi в этом случае будет актуальнее...
PM MAIL ICQ Skype GTalk Jabber   Вверх
alien_by
Дата 14.1.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: 5
Всего: 8



Хорошо зарекомендовал себя след способ

В класе своего трида (например СMyThread) обьявляешь, например, метод ReleaseThread.

void CMyThread::ReleaseThread(int nExitCode)
{
PostThreadMessage(WM_QUIT, nExitCode, NULL);
}

ну а когда поток надо кикнуть, вызываешь данный метод. Работает на ура.

PM MAIL ICQ   Вверх
En_t_end
Дата 14.1.2005, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



alien_by
Всё гениальное просто !
PM MAIL ICQ Skype GTalk Jabber   Вверх
Adil'
Дата 15.1.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 3
Всего: 15



А просто
Код
PostThreadMessage(MyThread->m_hThread, WM_QUIT, nExitCode, NULL);
нельзя?



--------------------
Удачи
PM MAIL WWW   Вверх
Nuzur
Дата 15.1.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



DWORD WINAPI Наверное вы правы, так действительно будет лучше, но лик всеравно остался, правда меньше 100 бай, но это вопрос принцыпа.

Может там проблема в самой функции? Она организована так:

DWORD WINAPI COM1(LPVOID Param)
{
while(true)
{
.....
Sleep(delay);
};
return 0;
}

Идем дальше,
void CMyThread::ReleaseThread(int nExitCode)
{
PostThreadMessage(WM_QUIT, nExitCode, NULL);
}

ничего не сработало smile Лик даже не изменился smile


--------------------
Never again...
PM MAIL   Вверх
S.A.P.
Дата 15.1.2005, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



Nuzur мой способ возьми.
PM MAIL   Вверх
Adil'
Дата 16.1.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 3
Всего: 15



Если на WinApi (точнее, не используя CWinThread), то PostThreadMessage не будет работать до тех пор, пока в процедуру потока не будет вставлена соответствующая обработка сообщений виндов (GetMessage или PeekMessage).
Сделай лучше
Код
BOOL Terminated=FALSE;
DWORD WINAPI COM1(LPVOID Param)
{
 while(!Terminated)
 {
   .....
   Sleep(delay);
 };
 return 0;
}
...
//в основном потоке
extern BOOL Terminated;
//запустить поток;
Terminated=FALSE;
hThread=CreateThread(...
...
//когда надо остановить
Terminated=TRUE;
WaitForSingleObject(hThread,INFINITE); //в приниципе, лучше вместо INFINITE поставить
//что-нибудь заведомо больше, чем delay из Sleep(delay)
CloseHandle(hThread);//если этого не сделать, то и будет лик байт на 100


Это сообщение отредактировал(а) Adil' - 16.1.2005, 12:16


--------------------
Удачи
PM MAIL WWW   Вверх
Goldberg
Дата 29.1.2005, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

Репутация: нет
Всего: нет



Если будешь использовать CWinThread, то:
BEGIN_MESSAGE_MAP(CTvoiPotok, CWinThread)
ON_THREAD_MESSAGE(WM_TO_THREAD, OnWMToThread)
END_MESSAGE_MAP()
В InitInstance() своего потока вызывай Run().

Ну и потом шлешь сообщения: PostThreadMessage(TvoiPotok.m_nThreadID, WM_TO_THREAD, 0, 0);
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Coocky
Дата 11.2.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Че-то я проморозился и морозиться продолжаю smile
Ну ладно,пора браться за старое smile
alien_by
А если не работаю с производным классом от СWinThread? smile
Вообще для остановки потока я знаю три способа:
1.Остановка с помощю задание флага,используя глобальную переменную(примитивно и неактуально)
2.Способ предложеный(похожий) на alien_by,с помощью отправки своего сообщения.
3.С помощью класса CEvent.
Если еще интересно ответь,я напишу с примерами.


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.