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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема при использовании синглтона в многопоточном приложении  (Прочитано 6850 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mike_I
Участник

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


« : 25-03-2009 20:36 » 

Привет, народ!
Ситуация такая: есть приложение, в котором запускается дополнительный поток.
И еще есть класс(синглтон), который используется как основным потоком, так и дополнительным потоком приложения. В синглтоне есть некая функция SendStopAppSoft(), которая вызывает еще что-то через OLE/COM, но это уже не суть.
Когда я вызываю эту функцию в основном потоке, все отрабатывает нормально, а когда в дополнительном, ничего не работает. Хотя я прохожу дебаггером и значения все те же.
ПОЧЕМУ НЕ РАБОТАЕТ? Не понял

Вот примерный код:
Код:
// Синглтон
class CTerminalSoftAuto : public CCmdTarget
{
public:
static CTerminalSoftAuto* GetInstance()
{
static CTerminalSoftAuto self;
return &self;
}

void SendStopAppSoft()
{
бла-бла-бла
}
}

// Основной поток
class CDevicedispDlgAuto : public CDialog
{
CTerminalManager *pTerminalManager;
CTerminalSoftAuto *pTerminalSoftAuto;

virtual BOOL OnInitDialog()
{
pTerminalSoftAuto = CTerminalSoftAuto::GetInstance();

// Запускаем доп. поток
pTerminalManager = (CTerminalManager*)AfxBeginThread(RUNTIME_CLASS(CTerminalManager));
}

void SomeFunc()
{
бла-бла-бла

pTerminalSoftAuto->SendStopAppSoft(); // ОТРАБАТЫВАЕТ НОРМАЛЬНО

бла-бла-бла
}
}

// Дополнительный поток
class CTerminalManager : public CWinThread
{
CTerminalSoftAuto *pTerminalSoftAuto;

virtual BOOL InitInstance()
{
pTerminalSoftAuto = CTerminalSoftAuto::GetInstance();

return TRUE;
}

void AnotherFunc()
{
бла-бла-бла

pTerminalSoftAuto->SendStopAppSoft(); // НЕ ОТРАБАТЫВАЕТ НОРМАЛЬНО!!! ПОЧЕМУ???

бла-бла-бла
}
}

P.S. Использую C++; VS2005; WinXP  Скромно так...
« Последнее редактирование: 05-04-2009 15:59 от Ghost » Записан

Nothing fails like success.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 26-03-2009 12:02 » 

1) У тебя что то не работает именно с графикой? Если можно, что именно не работает.
2) Также, стоят ли блокировшики?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
v2
Помогающий

ua
Offline Offline

« Ответ #2 : 26-03-2009 21:00 » 

> которая вызывает еще что-то через OLE/COM, но это уже не суть.

в новом потоке:
CoInitialize();
Записан
Mike_I
Участник

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


« Ответ #3 : 29-03-2009 13:39 » 

Finch: Нет, графика там не при чем. Там идет работа с устройствами.
         Что есть блокировщики? Наверно не стоят, раз я не знаю что это...

V2: Инициализация COM есть - AfxOleInit()
Записан

Nothing fails like success.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 29-03-2009 13:58 » 

Критические секции, мьютексы, семафоры и так далее. Кстати v2 предлагает тебе иницилизировать также COM и во втором потоке.
« Последнее редактирование: 29-03-2009 14:00 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mike_I
Участник

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


« Ответ #5 : 29-03-2009 14:19 » 

Я ему и ответил, что у меня инициализируется COM во втором потоке.   Да-да

Я тоже сначала подозревал, что потоки одновременное обращение все рушит, но когда идешь дебагерром, отключив второй поток, все равно не работает.
Записан

Nothing fails like success.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines