Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Сигнал" из среды в приложение 
V
    Опции темы
xvr
Дата 6.3.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(cupper @  6.3.2012,  16:04 Найти цитируемый пост)
Блокирующей явлется операция ConnectNamedPipe и на ней зависаем до тех пор пока в пайп из консоли не запишем что нить. 

Для определения факта посылки данных это в принципе тоже должно подойти

PM MAIL   Вверх
cupper
Дата 6.3.2012, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xvr @ 6.3.2012,  18:56)
Цитата(cupper @  6.3.2012,  16:04 Найти цитируемый пост)
Блокирующей явлется операция ConnectNamedPipe и на ней зависаем до тех пор пока в пайп из консоли не запишем что нить. 

Для определения факта посылки данных это в принципе тоже должно подойти

да но это взывает другие проблемы.

Условие изменилось и теперь нужно иметь возможность обработать "сигнал", и опять начать слушать его. Для этого единственно что пришло в голову закрывать pipe (CloseHandle), и создавать заново. Потом обнаружилась функции - DisconnectNamedPipe. Но не та не другая не могут прервать ожидание ConnectNamedPipe, а это уже странно. И пока что то у меня эти pipe вызывают только огорчение.

Это сообщение отредактировал(а) cupper - 6.3.2012, 22:11
PM MAIL   Вверх
cupper
Дата 6.3.2012, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чет не как немогу врубиться в OVERLAPPED.
Таки осилил smile Надеюсь больше без подводных камней
Код

#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;

HANDLE handle_ = NULL;
HANDLE stop_event = NULL;

DWORD WINAPI WorkerThreadProc( LPVOID _parameter )
{
    PSECURITY_DESCRIPTOR pSD=(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH);
    if (!pSD) 
        return 1;
    if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
        return 1;
    if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE))
        return 1;
    SECURITY_ATTRIBUTES sa;
    memset(&sa,0,sizeof(sa));
    sa.nLength=sizeof(sa);
    sa.lpSecurityDescriptor=pSD;
    handle_ = CreateNamedPipe(L"\\\\.\\pipe\\test", PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_MESSAGE|PIPE_WAIT, 10, 1000, 1000, 1000, &sa);
    LocalFree(pSD);
    if (handle_==INVALID_HANDLE_VALUE)
        return 1;

    OVERLAPPED  ovl;
    HANDLE      h, handleArray[2];
    BOOL        bStop = FALSE;
    memset(&ovl, 0, sizeof(ovl));
    handleArray[0] = stop_event = CreateEvent(NULL, FALSE, FALSE, NULL);
    handleArray[1] = ovl.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    while(true)
    {
        if (!ConnectNamedPipe(handle_, &ovl) && GetLastError() != ERROR_IO_PENDING) // here is blocking
        {
            CloseHandle(handle_);
            return 1;
        }
        switch(WaitForMultipleObjects(2, handleArray, FALSE, INFINITE))
        {
        case WAIT_OBJECT_0: // exit()
            {
                if(!CloseHandle(handle_))
                    return 1;
                else
                    return 0;
            }
        case WAIT_OBJECT_0 + 1: // message()
            {
                char buf[128];
                DWORD cnt=0;
                ReadFile(handle_, buf, 128, &cnt, NULL);
                buf[cnt]=0;
                cout << std::string(buf, cnt);

                if(!DisconnectNamedPipe(handle_))
                    return 1;
            }
        }
    }
    return 1;
}

void stop()
{
    SetEvent(stop_event);
}


int main()
{
    DWORD idWorkerThread = 0;
    HANDLE hWorkerThread = ::CreateThread( NULL, 0, &WorkerThreadProc, NULL, 0, &idWorkerThread );

    char a;
    cin >> a;

    stop();

    cin >> a;
} 


Это сообщение отредактировал(а) cupper - 6.3.2012, 23:01
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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