Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2009, 13:46   #1
Sasha811
Пользователь
 
Регистрация: 20.12.2008
Сообщений: 22
По умолчанию LPVOID и поток в MFC

О задаче в общем. Нужно считывать данные от OPC сервера с заданной периодичностью и записывать их в БД. До БД еще далеко так как не могу организовать поток чтения данных.


Есть MFC диалог EERIESTREAMDlg в классе которого объявлена friend-функция потока. Там же объявлен объект myOPCEasy – через него буду вязаться с OPC Сервером (не думаю что сейчас важна подробная суть myOPCEasy).

Код:
class CEERIESTREAMDlg : public CDialog
{
//…
public:
COPCEasy myOPCEasy;

friend UINT threadFunc(LPVOID pParam);
//…

//..
}

Есть реализация функции потока - суть ее не важна абсолютно. Пока важно только то, что я пытаюсь вызвать ЛЮБУЮ функцию объекта myOPCEasy – в данном случае подключение к OPC серверу.

Код:
UINT threadFunc(LPVOID pParam)
{
UINT Result = ((CEERIESTREAMDlg*)pParam)->myOPCEasy.OPCConnectCreate("Schneider-Aut.OFS");
return 0;
}

Так вот:
Если просто вызвать threadFunc(this), то OPCConnectCreate отработает корректно – но это уже не поток.
Если вызывать threadFunc как поток AfxBeginThread(threadFunc,this)
– OPCConnectCreate не отработает корректно.


1.
Расскажите в чем разница между вызовами threadFunc(this) и AfxBeginThread(threadFunc, this) с точки зрения передачи параметра LPVOID – я же и в 1-м и во 2-м случае передаю указатель this.

2.
Может все-таки дело в myOPCEasy, в нем я использовал COM интерфейсы – что для меня очень сложно.
Отладчиком дохожу до следующей строки

HRESULT r2 = CoGetClassObject(clsid, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (void**)&pCF).
pCF объект интерфейса IClassFactory.

в 1-м случае pCF назначается осмысленный адрес (типа 0x0012а57с) во 2-м случае 0x000000с.

P.S.
Не судите за возможный бред в вопросе – я не IT-шник.

Последний раз редактировалось MaTBeu; 13.07.2009 в 11:23.
Sasha811 вне форума Ответить с цитированием
Старый 12.07.2009, 16:41   #2
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

я тебе скажу. в первом случае ты просто вызываешь функцию, во вотором создаешь поток. у тебя вопрос, почему работает некорректно, отвечаю, потому что функция которая создавала поток и передавала параметры потоку закончилася быстрее чем создался поток, тоесть передаваемые данные существовавшие только в функции которая создавала поток - разрушаються(очищаються , хз) до того как создаеться поток. 0x000000с означаеть NULL тоесть нету его, как раз тошо я тебе и говорил. поставь задержку сразу после создания потока
Код:
 Sleep(100)
и все будет работать. надеюся объяснил понятно

З.Ы. Про потоки ищи в инете

Последний раз редактировалось lennon; 12.07.2009 в 16:49.
lennon вне форума Ответить с цитированием
Старый 13.07.2009, 10:39   #3
Sasha811
Пользователь
 
Регистрация: 20.12.2008
Сообщений: 22
По умолчанию LPVOID и поток в MFC

К сожалению не поучилось используя Sleep(...).

На другом форуме я тоже поднял эту тему.

Судите сами:
http://www.cyberforum.ru/visual-cpp/...tml#post213139
Sasha811 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОТОК Neymexa Общие вопросы .NET 5 12.05.2009 01:03
поток и progressbar TaTT DoGG Общие вопросы .NET 24 06.05.2009 17:59
Поток Черничный Общие вопросы Delphi 5 27.09.2008 21:23
Поток в никуда... prizrak1390 Работа с сетью в Delphi 1 30.06.2008 10:32
Убить поток Баламут Общие вопросы Delphi 3 22.03.2008 05:04