Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CAsyncSocket и потоки, запутался, кто кого вызывает. 
:(
    Опции темы
JoyEx
Дата 23.12.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Сишный оконный класс всего лишь обслуживает настоящее Windows окно (subклассит), очередь сообщений есть у GUI-потока, она "прокручивается" всегда примерно вот так:
Код

    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
    { 
        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    } 


Там, где есть окно там и есть GUI поток.

Цитата(Dreamer_0x01 @ 23.12.2005, 19:32)
Тогда мне наверное следует создать свой интерфейсный поток именно для этих целей, чтобы в ожидании не "усыплять" поток, который должен будет "прокручива" эту очередь сообщений.
Правильно?

ну да, чтобы не было deadlock (взаимоблокировки).



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 23.12.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Вот, наконец-то я тогда начинаю понимать, почему не вызываются события сокета - потому что собственно некому их вызывать...

Ладно, щас попробуем все еще и в потоковые классы завернуть.
Была у меня конечно идея использовать синхронный сокет (который CSocket), но там заче-то надо порождать классы CArchive, СSocketFile, по-моему, слишком тяжеловесно. Думаю, получится написать свой синхронный сокет, благо мне не та много от него надо.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 23.12.2005, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Dreamer_0x01
Зачем переделывать код? Надо всего лишь "прокачать" очередь сообщений, чтобы сообщения были обработаны родной оконой процедурой какого-то окна, а потом продолжать чё-то свое делать.


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 23.12.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(JoyEx @ 23.12.2005, 19:58)
Надо всего лишь "прокачать" очередь сообщений, чтобы сообщения были обработаны родной оконой процедурой какого-то окна, а потом продолжать чё-то свое делать.


Это как? Притащить в оно цепочку указателей на мой сокет, и там принудительно сделать его DispatchMessage ?



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 23.12.2005, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Нет.
С помощью PeekMessage()-TranslateMessage()-DispatchMessage() можно "прокачать" очередь в любом месте потока.
Добавлено @ 20:26
Код

    MSG msg;

    while(::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)){
        if(msg.message == WM_QUIT) break;
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 23.12.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Не понимаю, в какое именно место мне надо такой код добавить?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 23.12.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Цитата(Dreamer_0x01 @ 23.12.2005, 20:41)
Не понимаю, в какое именно место мне надо такой код добавить?


там, где у тебя долго выполняется код


smile I'll be back (from The Terminator)
Пока!

Это сообщение отредактировал(а) JoyEx - 23.12.2005, 20:44


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 23.12.2005, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



ВАХ! ну наконец-то заработало!
Единственное...поясни пожалуйста, почем в PeekMessage в качестве дескриптера окна передается NULL.
smile


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 24.12.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Цитата(Dreamer_0x01 @ 23.12.2005, 20:57)
Единственное...поясни пожалуйста, почем в PeekMessage в качестве дескриптера окна передается NULL


Чтобы вытаскивать из очереди сообщения всех окон данного потока, вот что пишут $M:
Цитата(MSDN)

If hWnd is NULL, PeekMessage retrieves messages for any window that belongs to the current thread.


PeekMessage() в отличие от GetMessage() "прокачивает" очередь, т.е. если в очереди нету сообщений PeekMessage() возвращает управление (=0), а GetMessage() только при получении WM_QUIT.

Вот тебе мой макет
Код

class ASocket: public CAsyncSocket{

    void OnConnect(int nErrorCode ){

        if(nErrorCode != 0) return;

        char buff[] = "Hello!!!";
        int len = strlen(buff)+1;
        Send (buff, len);
    }
};


Это ф-ция потока:
Код

UINT MyControllingFunction( LPVOID pParam ){

    ASocket asocket;

    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(2, 2);

    WSAStartup( wVersionRequested, &wsaData );

    asocket.Create ();
    asocket.Connect ("127.0.0.1", 80);

    MSG msg;
    while(GetMessage (&msg, 0, 0, 0) == TRUE){

        if(msg.message == 0x00000373 /*WM_SOCKET_NOTIFY*/){
            TRACE("\nOkay!!!\n");
        }
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }

    return 0;
}



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 25.12.2005, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Что ж, ты мне этой штукой (конструкцией с PeekMessage)очень помог, причем как выяснилось, не тоьлко в сокетах, а вообще в большинстве мест, где моя программа "подтормаживала".

Спасибо.

Репутация "+".


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 25.12.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Dreamer_0x01, спасибо.

Для справки: В MS VС++ из Class View v7 очень удобно и быстро можно попасть на базовый класс (и его .cpp) через "Bases and Interfaces".



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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