Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: задачка по multithreading  (Прочитано 12108 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ary
Гость
« : 31-08-2004 07:10 » 

имеются 2 потока ,запускаемых из главного окна MFC-приложения
(CMainFrame)

Код:
   th_1 = (CFirstThread*)AfxBeginThread(RUNTIME_CLASS(CFirstThread),
THREAD_PRIORITY_NORMAL,CREATE_SUSPENDED,0);

    CView*vw= GetActiveFrame()->GetActiveView();

    th_1->SetOwner(vw);

    th_1->ResumeThread();

   th_2 = (CSecondThread*)AfxBeginThread(RUNTIME_CLASS(CSecondThread),THREAD_PRIORITY_NORMAL,CREATE_SUSPENDED,0);

   th_2->SetOwner(vw);

   th_2->ResumeThread();

Внутри каждого потока запускается отрисовка определенной фигуры:

Код:
int CFirstThread::Run() 
{
   
   extern CMyTestApp theApp;
   CMutex* mm = theApp.m_mutex;
   CSingleLock sLock(theApp.m_mutex);
   CDC*pDC = m_pMainWnd->GetDC();
   pDC->DrawFirstShape();
   m_pMainWnd->ReleaseDC(pDC);
   return 0;
}

int CSecondThread::Run()
{
   
   extern CMyTestApp theApp;
   CMutex* mm = theApp.m_mutex;
   CSingleLock sLock(theApp.m_mutex);
   CDC*pDC = m_pMainWnd->GetDC();
   pDC->DrawSecondShape();
   m_pMainWnd->ReleaseDC(pDC);
   return 0;
}

Требуется:при запуске нескольких копий приложения
добиться чтобы все окна приложений отрисовали сначала DrawFirstShape()-т.е. чтобы в каждом процессе(копии приложения)
отрабатывался сначала первый поток;и только когда последняя из копий приложения отрисует ,начинается отрисовка второго потока
DrawSecondShape() во всех запущенных копиях приложения.
Как видно из кода,я пытаюсь использовать мутекс,но в результате
идет последовательная отрисовка из двух потоков поочередно в
каждой копии приложения.
Заранее благодарю за помощь Пиво!
« Последнее редактирование: 01-12-2007 12:37 от Алексей1153++ » Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 31-08-2004 09:48 » 

ary, что значит "во всех запущенных копиях приложения"?

Получается, что при старте приложения должны каким-то образом договориться, что они будут друг друга ждать.  Иначе они могут бесконечно ждать, пока будет запущено ещё одно приложение, и ещё одно, и ещё одно.  Надо точно определить, что значит "при запуске нескольких копий приложения".
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
ary
Гость
« Ответ #2 : 31-08-2004 10:14 » 

Цитата: npak
ary Надо точно определить, что значит "при запуске нескольких копий приложения".


     Хорошо , тогда давайте для простоты дела установим, что может быть запущено только  2 копии приложения - и не более.
Записан
Serega
Гость
« Ответ #3 : 31-08-2004 10:18 » 

Можно создать глобальный именованный мютекс, смотри CreateMutex
И используй Readers/Writers Lock
Записан
ary
Гость
« Ответ #4 : 31-08-2004 10:34 » 

Serega,  вы не могли бы набросать конспективно- как это использовать?

у меня к сожалению нет опыта работы с потоками.
Записан
Serega
Гость
« Ответ #5 : 31-08-2004 11:44 » 

Защелка работает следующим образом:
- Писать может только один, когда ресурс свободен
- Читать могут многие, когда никто не пишет

Нашел описание Reader/Writer Lock в PThreads

Неблагодарное это занятие, работать с потоками в C++  Здесь была моя ладья...
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 31-08-2004 22:03 » 

да нееее Serega, ты не прав... просто как говориться , во всем нужна сноровка зарядка треннировка... а главное один раз качественно обернул - и ни каких проблем это я об этом
Цитата

Неблагодарное это занятие, работать с потоками в C++
Записан

С уважением Lapulya
Serega
Гость
« Ответ #7 : 01-09-2004 06:50 » new

Не спорю, но уж слишком много приходится оборачивать (в общем-то весь WINAPI Ага)
И не всегда это качественно получается сделать, не зная всех тонкостей и зависимостей этого API Отлично
Я думаю лучше использовать решения профессионалов и работать с Java или .NET
Записан
Anonymous
Гость
« Ответ #8 : 01-09-2004 12:17 » 

Цитата: ary
Цитата: npak
ary Надо точно определить, что значит "при запуске нескольких копий приложения".


     Хорошо , тогда давайте для простоты дела установим, что может быть запущено только  2 копии приложения - и не более.


Можно не пользоваться примитивами синхронизации и всё сделать на сообщениях.

Надо сделать обработчики для трёх событий:
-- "рисовать первую часть"
-- "рисовать вторую часть"
-- "я готов"

При создании окна надо послать самому себе сообщение "рисовать первую часть".  Обработчик для этого события выставляет флаг "первая часть".  Обрабочик события для WM_PAINT при поднятом флаге "первая часть" русует первую кривую.

После отрисовки первой кривой надо взвести флаг "я готов к второй кривой" и послать сообщение "я готов" всем окнам (или сначала найти подходящие окна через EnumWindows), в том числе и себе. Обработчик события "я готов" проверяет, сколько сообщений получено.  Если получено два сообщения (от себя и от того парня), то уже можно рисовать вторую кривую.  Посылаешь себе сообщение "рисовать вторую часть".

Обработчик сообщения "рисовать вторую часть" указывает, что при перерисовке окна надо рисовать вторую кривую, например сбрасывает флаг "первая часть" и взводит флаг "вторая часть".  обработчик для WM_PAINT, при поднятом флаге "вторая часть", рисует вторую кривую.

Вот такая концептуальная схема.  Я пока не пользовался MFC, но полагаю, туда можно добавить обработчики для нестандартных событий.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 01-09-2004 12:20 » 

Мда, пока писал, меня выкинуло в Гостя.

Так вот, Гость -- это npak
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
ary
Гость
« Ответ #10 : 02-09-2004 13:07 » 

Нашел решение: Жжешь

Ставим семафор и мутекс -и все OK!

Код:
int CFirstThread::Run() 
{
   
   extern CMyTestApp theApp;
   
   CSingleLock sLock(theApp.m_semaphore);
   CSingleLock sLock_1(theApp.m_mutex);
   sLock.Lock();sLock_1.Lock();
 

   CDC*pDC = m_pMainWnd->GetDC();
   pDC->DrawFirstShape();
   m_pMainWnd->ReleaseDC(pDC);
   return 0;
}

int CSecondThread::Run()
{
   
   extern CMyTestApp theApp;

   CSingleLock sLock(theApp.m_semaphore);
   CSingleLock sLock_1(theApp.m_mutex);
   sLock.Lock();sLock_1.Lock();


   CDC*pDC = m_pMainWnd->GetDC();
   pDC->DrawSecondShape();
   m_pMainWnd->ReleaseDC(pDC);
   return 0;
}

Так что многопоточность в MFC - занятие вполне благодарное;)

Спасибо всем ,кто откликнулся! :l_happy2:
« Последнее редактирование: 01-12-2007 12:40 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines