Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CWinThread, завершить поток 
:(
    Опции темы
Goldberg
Дата 8.12.2004, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток всем!
Как всегда неожиданно возникла проблемма.smile
Создаю класс, производный от CWinThread, добавляю в него большое кол-во своих функций, которые вызываю совершенно обычным образом(class.funcname), но есть функции выполнение которых занимает большой промежуток времени. Поэтому я засовываю вызов этих функций в InitInstance() и вызываю CreateThread() своего класса. Поток успешно выполняется. Но, как мне его после этого завершить? Дело в том, что существует, потребность многократно вызывать те функции(вызов которых я помещаю в InitInstance()), но поток после их выполнения продолжает существовать.
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Mad
Дата 8.12.2004, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



После завершения функций делаеш вызов ExitThread()


--------------------
user posted image
PM MAIL   Вверх
Goldberg
Дата 8.12.2004, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

BOOL CSerial::InitInstance()
{
Start();

DWORD code;
GetExitCodeThread(this->m_hThread, &code);

ExitThread(code);

return TRUE;
}

Поток завершается, но при следующем создании происходит ошибка...
Добавлено @ 21:14
Причем если нажать Пропустить, то программа продолжает выполнятся, успешно завершая операцию. smile
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Goldberg
Дата 9.12.2004, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ура разобрался!
Все, как всегда оказалось очень просто. smile
В конструкторе:
m_bAutoDelete = 0;

В InitInstance пишем return 0.
После выполнения InitInstance поток убивается, после чего можно опять вызывать CreateThread().

Всем спасибо! smile
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Goldberg
Дата 11.12.2004, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А никто не знает, где можно скачать иходники с диска прилогаемого к книге Питера Нортона "Руководство Питера Нортона по программированию в Windows95/NT с помощью MFC" ?
SAMS Publishing, USA, 1996.
Перевод "СК Пресс", 1998.
Там есть пример решения моего вопроса, хочу посмотреть(может там лучше). smile
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Goldberg
Дата 12.12.2004, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я тут подумал, что все-таки нерационально каждый раз поток создавать/убивать. Решил использовать сообщения. Но как правильно это реализовать? Из МСДН понял, что с этим проблеммы(статьи ниже).
Делаю так:

В CSerial.h:
Код

protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnWMToThread(UINT wParam, LONG lParam); //ЗДЕСЬ СОМНЕВАЮСЬ


В CSerial.сpp:
Код

BEGIN_MESSAGE_MAP(CSerial, CWinThread)
ON_THREAD_MESSAGE(WM_TO_THREAD, OnWMToThread)
END_MESSAGE_MAP()

void CSerial::OnWMToThread(UINT wParam, LONG lParam)
{
   .............Код..............
}


Затем(естесственно перед этим запускаю поток):
Код

WPARAM wParam = MAKEWPARAM(0,0);
LPARAM lParam = MAKELPARAM(0,0);
PostThreadMessage(serial.m_nThreadID, WM_TO_THREAD, wParam, lParam);


************
When calling the Windows PostThreadMessage function within an MFC application, the MFC message handlers are not called. For more information, see the Knowledge Base article, "PRB: MFC Message Handler Not Called with PostThreadMessage()" (Q142415).
-----------
Knowledge Base

PRB: MFC Message Handler Not Called with PostThreadMessage()PSS ID Number: 142415

Article Last Modified on 5/7/2001


--------------------------------------------------------------------------------
The information in this article applies to:


Microsoft Visual C++ 1.0
Microsoft Visual C++ 2.0
Microsoft Visual C++ 2.1
Microsoft Visual C++ 2.2
Microsoft Visual C++ 4.0
Microsoft Visual C++ 4.1

--------------------------------------------------------------------------------

This article was previously published under Q142415
SYMPTOMS
When code uses the PostThreadMessage() Win32 function, the MFC message handlers are not called.
CAUSE
When you call PostThreadMessage(), the message is placed in the thread's message queue. However, because messages posted this way are not associated with a window, MFC will not dispatch them to message or command handlers. In order to handle these messages, override the PreTranslateMessage() function of your CWinApp-derived class, and handle the messages manually.
RESOLUTION
The following code demonstrates how to call PostThreadMessage() in the InitInstance() of the CWinApp-derived class using a single-threaded application. The principle is the same for secondary threads except that the code shown here would be put in your alternate CWinThread-derived class.

Visual C++ 4.2 does support handling messages posted to threads. For more information, see ON_THREAD_MESSAGE in the Visual C++ 4.2 documentation.

NOTE: MFC worker threads do not have a message loop/pump associated with them so you must use a user-interface thread.
Код

Sample Code
/* Compile options needed:

  standard MFC project generated by AppWizard */

BOOL CThreadMsgApp::PreTranslateMessage(MSG* pMsg)
{
   // Is it the Message you want?
   // You can use a switch statement but because this is
   // only looking for one message, you can use the if/else
   if (pMsg->message == WM_USER+2268)
   {
       // Call the function to handle this message
  OnReceivedCommand(pMsg->wParam,pMsg->lParam);
       // Tell MFC no more processing is needed
       return TRUE;
   }
   else
       // Call MFC to have it continue processing the message
       return CWinThread::PreTranslateMessage(pMsg);
}

BOOL CThreadMsgApp::InitInstance()
{
   WPARAM wParam;
   LPARAM lParam;
   wParam = MAKEWPARAM(0,0); // We can put whatever we
   lParam = MAKELPARAM(0,0); // want in wParam & lParam

   // Send the user-defined Thread Message
   // m_nThreadID is a member of CWinThread that holds the thread ID
   PostThreadMessage(m_nThreadID, WM_USER+2268, wParam, lParam);

   return TRUE;
}

void CThreadMsgApp::OnReceivedCommand(WPARAM wParam, LPARAM lParam)
{
   // You can do whatever you want in here, this is simply
   // sending output to the debug window
   TRACE0("Received WM_USER+2268!!\n");
}


REFERENCES
For more information on the CWinThread object, please see the following: MFC Encyclopedia, Multithreading: Creating User-Interface Threads.


Additional query words: 1.00 2.00 2.10 2.20 4.00 4.10

Keywords: kbprb kbThread KB142415
Technology: kbAudDeveloper kbvc100 kbVC200 kbVC210 kbVC220 kbVC400 kbVC410 kbVCsearch
*******************************
Так вот, не получается.
smile smile smile

Это сообщение отредактировал(а) Goldberg - 12.12.2004, 23:16
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Goldberg
Дата 13.12.2004, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Разобрался. smile
Нужно в InitInstance() потока, вызывать Run().
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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