Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции в отдельном потоке, Вызов функции в отдельном потоке 
:(
    Опции темы
UfoLand
Дата 12.10.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день/вечер

Возникла проблемма...

Есть некая библиотека в которой описан класс

Код

class CVaxSIPUserAgentLib  
{
....

BOOL Connect(int nLineNo, LPCTSTR sToURI, int nInputDeviceId, int nOutputDeviceId);
BOOL Disconnect(int nLineNo);

BOOL AcceptCall(int nLineNo, LPCTSTR sCallId, int nInputDeviceId, int nOutputDeviceId);
BOOL RejectCall(LPCTSTR sCallId);
    

virtual void OnTryingToRegister();
virtual void OnFailToRegister();
virtual void OnSuccessToRegister();
    
virtual void OnTryingToUnRegister();
virtual void OnFailToUnRegister();
virtual void OnSuccessToUnRegister();

...
}


я создал класс


Код

class CVaxVoIP : public CVaxSIPUserAgentLib  
{
....

public:
void Start();


void OnTryingToRegister();
void OnFailToRegister();
void OnSuccessToRegister();

...
}


Функции данного класса вызваются в отдельном потоке

Код

DWORD WINAPI OtherThread (LPVOID lpPar)
{
    CVaxVoIP* m_pVaxVoIP=(CVaxVoIP *)lpPar;

    m_pVaxVoIP->Start();
    m_pVaxVoIP->Connect(int nLineNo, LPCTSTR sToURI, int nInputDeviceId, int nOutputDeviceId);

    return 0;
}


в результате работы функции Connect()  из клсса CVaxSIPUserAgentLib на сервер отправляется сообщение, на которое сервер должен ответить с помощью функций:

Код

void OnTryingToRegister();
void OnFailToRegister();
void OnSuccessToRegister();


(т.е должен поступить ответ на запрос соединения)

однако ответ от сервера не приходит(или собщение не отправляется серверу).....(и никаких ошибок не выдаётся)

При вызове функций

m_pVaxVoIP->Start();
m_pVaxVoIP->Connect(int nLineNo, LPCTSTR sToURI, int nInputDeviceId, int nOutputDeviceId);

в основном потоке всё замечательно работает и сервер отвечает на запрос...

Как добиться получения ответа от сервера при вызове функций в отдельном потоке???

Подскажите пожалуйста как решить эту проблему и причины её возникновения...

Вызов потока:

Код

CVaxVoIP* m_pVaxVoIP;
m_pVaxVoIP = new CVaxVoIP;    
HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&OtherThread,m_pVaxVoIP,0,NULL);



спасибо.

PM MAIL   Вверх
dumb
Дата 12.10.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(UfoLand @  12.10.2007,  15:32 Найти цитируемый пост)
Подскажите пожалуйста как решить эту проблему и причины её возникновения...
при решении проблем многопоточности описания классов погоды не делают - нужны именно реализации, причем в наиболее полном виде. иначе - только сам.
PM MAIL   Вверх
UfoLand
Дата 12.10.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как реализован класс CVaxSIPUserAgentLib  - с помощью которого и происходит общение с сервером, мне не известно, у меня есть только dll

я лишь вызываю методы этого класса, и сервер мне отвечает с помощью этих методов...
я даже не знаю какой код сюда выкладывать...

вот для примера запрос на соединение с сервером:
Код


void CVaxVoIP::Start()
{
    SetLicenceKey("TRIAL-LICENSE-KEY");
    CString MyIP="xxx.xxx.x.x"; 
    CString FromURI;
    FromURI.Format("%s <sip:%s@%s>","xxxxx","xxxxxx",MyIP);


    if (!Initialize(FALSE,MyIP,5080,FromURI,"","sip.address.reg","xxxxx","xxxxxxx",TRUE,1))// из класса CVaxSIPUserAgentLib  
    {
        printf("Error initializing SIP library!\n");
    }
}
void CVaxVoIP::Connect()
{
    int nListenPortRTP=7000;
    if(!OpenLine(0, FALSE, "xxx.xxx.x.x", nListenPortRTP))//ф-я реализована в классе CVaxSIPUserAgentLib  
    {
        printf("ERROR!\n");
    }
    if(!RegisterToProxy(3600))
    {
        printf("ERROR!\n");
    }
    EnableKeepAlive(10);
    if (EnableEchoNoiseCancellation())
        printf("ENC enable");
    SelectVoiceCodec(0);

    CString fmt="sip:[email protected]";
    CVaxSIPUserAgentLib::Connect(0,fmt,-1,-1);
}
в ответ сервер должен вызвать функцию

Код

void CVaxVoIP::OnTryingToRegister()    //виртуальная ф-я класса CVaxSIPUserAgentLib
{
    CString sMsg =(CString) "";
    sMsg.Format("Trying reg");
}
но этого не происходит если вызов Start и Connect идет в отдельном потоке...(OtherThread)
PM MAIL   Вверх
dumb
Дата 12.10.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



библиотека, насколько я понял, активно пользует MFC. также были замечены функции, использующие нотификацию сообщениями(WSAAsyncSelect, SetTimer, ...)
как минимум, попробуй создать в потоке окно и сделать выборку сообщений.
но есть у меня сурьезные опасения, что это все не заработает - если библиотека создавалась без прицела на многопоточную работу, то ой.
PM MAIL   Вверх
UfoLand
Дата 16.10.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема решена, причины скрыты в самой реализации библиотеки.
Тему можно закрыть.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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