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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WaitForSingleObject в созданном потоке 
V
    Опции темы
freezeman
Дата 25.3.2012, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет!

Подскажите, пожалуйста, в чем может быть проблема...
Создал в консоли событие и ожидаю ответ функцией WaitForSingleObject из другого приложения PulseEvent...все работает как задумано.

Но когда перенес код в службу в отдельный поток, вылетает после WaitForSingleObject...

Создавал поток в службе так:
Код

MyWaitForSingleObject() {
    ...
}

DWORD WINAPI ThreadFunc(LPVOID v) {
   MyWaitForSingleObject();
}

// Здесь стартует сервис
void CServiceContext::OnServiceStart()
{
   DWORD thID;
   DWORD PID = 1000;
   CreateThread(NULL, NUll, ThreadFunc, &PID, NULL, &thID);
}


И ещё, как удалить поток с помощью RemoteThread?
PM MAIL   Вверх
freezeman
Дата 25.3.2012, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подскажите, please! Что только не перепробовал...проблема скорее всего в потоке, как решить??
PM MAIL   Вверх
volatile
Дата 25.3.2012, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(freezeman @  25.3.2012,  12:12 Найти цитируемый пост)
Подскажите, please! Что только не перепробовал...проблема скорее всего в потоке, как решить?? 

Чтоб получить ответ, нужно правильно сформировать вопрос.
В вашем коде нет вобще ничего.
где WaitForSingleObject  ?
что означает
Цитата(freezeman @  25.3.2012,  10:23 Найти цитируемый пост)
 вылетает после WaitForSingleObject...

вылетает с ошибкой, или что?
PM MAIL   Вверх
freezeman
Дата 25.3.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(volatile @ 25.3.2012,  12:53)
Цитата(freezeman @  25.3.2012,  12:12 Найти цитируемый пост)
Подскажите, please! Что только не перепробовал...проблема скорее всего в потоке, как решить?? 

Чтоб получить ответ, нужно правильно сформировать вопрос.
В вашем коде нет вобще ничего.
где WaitForSingleObject  ?
что означает
Цитата(freezeman @  25.3.2012,  10:23 Найти цитируемый пост)
 вылетает после WaitForSingleObject...

вылетает с ошибкой, или что?

Я написал код создания потока, думаю там ошибка... Когда тот же код выполняю в основном потоке работает нормально, в созданном мною вылетает без ошибки

Код:
Код

// ServiceContext.cpp: implementation of the CServiceContext class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ServiceContext.h"
#include "ServiceHelper.h"
#include <fstream>
#include <stdlib.h>
#include <Windows.h>
#include <tlhelp32.h>
#include <malloc.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <tchar.h>
#include <psapi.h>
#include <strsafe.h>
#include <string.h>
using namespace std;

#define BUF_SIZE 512
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process.");

int MyWaitSingleObject(void);

struct ReadFileParam
{
    HANDLE hFile;
    LPVOID lpBuffer;
    DWORD nNumberOfBytesToRead;
    LPDWORD lpNumberOfBytesRead;
    LPOVERLAPPED lpOverlapped;
};

int MyWaitSingleObject(void)
{
    FILE *out;
    out = fopen("c:\\service.txt", "at");
    fprintf(out, " | Сообщение из MyWaitSingleObject | \n");
    fclose(out);

    HANDLE hMapFile;
    ReadFileParam *pBuf;
    HANDLE hEvent = ::CreateEvent (NULL, true, false, TEXT("MyEvent\0")); //Открываем событие

    if (hEvent == NULL) {
        return 1;
    }

    hMapFile = CreateFileMapping(
                    INVALID_HANDLE_VALUE,    
                    NULL,                    
                    PAGE_READWRITE,          
                    0,                       
                    BUF_SIZE,                
                    szName);                 

    if (hMapFile == NULL)
    {
        return 1;
    }
    pBuf = (struct ReadFileParam*)MapViewOfFile(hMapFile,   
                                        FILE_MAP_ALL_ACCESS, 
                                        0,
                                        0,
                                        BUF_SIZE);
    if (pBuf == NULL)
    {
        FILE *out;
        out = fopen("c:\\service.txt", "at");
        fprintf(out, " | Error. Could not map view of file | \n");
        fclose(out);
        CloseHandle(hMapFile);
        return 1;
    }

    while (true) {
        WaitForSingleObject(hEvent, INFINITE); //Ждём появления данных для получения
    }
    UnmapViewOfFile(pBuf);

    CloseHandle(hMapFile);
    return 0;
}


DWORD WINAPI ThreadFunc2(LPVOID s1)
{
    FILE *out;
    out = fopen("c:\\service.txt", "at");
    fprintf(out, " | Сообщение из созданного потока ThreadFunc2| \n");
    fclose(out);
    MyWaitSingleObject();
   return 0;
}

HANDLE hThreadInject;
HANDLE hThreadStat;
void CServiceContext::OnServiceStart()
{
     FILE *out;
     out = fopen("c:\\service.txt", "at");
     fprintf(out, "Сервис запущен.\n");
     fclose(out);

     DWORD thID2;
     DWORD PID2 = 1000;
     hThreadStat = CreateThread(NULL, NULL, ThreadFunc2, &PID2, NULL, &thID2);

     DWORD thID;
     DWORD PID = 1000;
     hThreadInject = CreateThread(NULL, NULL, ThreadFunc, &PID, NULL, &thID);
}

void CServiceContext::OnServiceStop()
{
     FILE *out;
     out = fopen("c:\\service.txt", "at");
     fprintf(out, "Сервис остановлен.\n");
     CloseHandle(hThreadInject);
     fprintf(out, "Поток hThreadInject остановлен.\n");
     CloseHandle(hThreadStat);
     fprintf(out, "Поток hThreadStat остановлен.");
     fclose(out);
}



Добавлено через 11 минут и 59 секунд
Может какие-нибудь особенности есть?? Я только выяснил, что ни проекция созданная в памяти не открылась, ни событие CreateEvent...
PM MAIL   Вверх
volatile
Дата 25.3.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(freezeman @  25.3.2012,  13:01 Найти цитируемый пост)
Я только выяснил, что ни проекция созданная в памяти не открылась, ни событие CreateEvent

Ну так с этого и надо начинать было. 
Посмотрите что  GetLastError () говорит после CreateEvent(), почему не открылось?
PM MAIL   Вверх
Dem_max
Дата 25.3.2012, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Этот  код просто пипец
Код

    while (true) {
        WaitForSingleObject(hEvent, INFINITE); //Ждём появления данных для получения
    }



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
freezeman
Дата 25.3.2012, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Dem_max @ 25.3.2012,  14:17)
Этот  код просто пипец
Код

    while (true) {
        WaitForSingleObject(hEvent, INFINITE); //Ждём появления данных для получения
    }

))))) Почему? У меня внедряется dll в процессы и перехватывает сообщения, перехватив в этом цикле получать сообщения о поступивших данных для статистики и обратно ожидать новых данных, после WaitForSingleObject полученные данные будут заноситься в массив для статистики... Есть более не пипецное решение?)))
PM MAIL   Вверх
Dem_max
Дата 25.3.2012, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Если в этот код передастся управление то он будет работать вечно и этот поток ужи ничего не выполнит


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
freezeman
Дата 25.3.2012, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Dem_max @ 25.3.2012,  14:30)
Если в этот код передастся управление то он будет работать вечно и этот поток ужи ничего не выполнит

Я думаю, что после создания проецируемого файла и события, зайдя в цикл требуется только принимать данные, которые записываются в проец. файл и посылается событие PulseEvent из другой программы, тем самым получается бесконечные "приёмник"...

Я ошибаюсь?
PM MAIL   Вверх
Dem_max
Дата 25.3.2012, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Ошибаешься, поток войдет в бесконечный цикл и больше ничего не сделает никогда, даже поток никогда не закроется корректно.

Это сообщение отредактировал(а) Dem_max - 25.3.2012, 14:42


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
freezeman
Дата 25.3.2012, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Dem_max @ 25.3.2012,  14:41)
Ошибаешься, поток войдет в бесконечный цикл и больше ничего не сделает никогда, даже поток никогда не закроется корректно.

Ну это не главная проблема... я тестировал вроде бы работало с одним сообщением это точно, с очередью не проверил, думал все нормально...

Подскажи, пожалуйста, почему когда я создаю проекцию и событие в основном потоке, то в других приложениях они благополучно открываются, а если выношу в отдельный поток, то нет...
PM MAIL   Вверх
Dem_max
Дата 25.3.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
freezeman
Дата 25.3.2012, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(volatile @ 25.3.2012,  14:12)
Цитата(freezeman @  25.3.2012,  13:01 Найти цитируемый пост)
Я только выяснил, что ни проекция созданная в памяти не открылась, ни событие CreateEvent

Ну так с этого и надо начинать было. 
Посмотрите что  GetLastError () говорит после CreateEvent(), почему не открылось?

Если я сделал все правильно, код ошибки 0x5
PM MAIL   Вверх
volatile
Дата 25.3.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(freezeman @  25.3.2012,  15:10 Найти цитируемый пост)
Если я сделал все правильно, код ошибки 0x5 

Number: 5
Constant: ERROR_ACCESS_DENIED

Проблема в первом аргументе функции 
Цитата(freezeman @  25.3.2012,  13:01 Найти цитируемый пост)
CreateEvent (NULL, true, false, TEXT("MyEvent\0")); 

там должны быть нормальные аттрибуты, а не NULL

Верней даже не здесь, а в основной программе, которая и создает первый евент.

PM MAIL   Вверх
freezeman
Дата 25.3.2012, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(volatile @ 25.3.2012,  15:39)
Цитата(freezeman @  25.3.2012,  15:10 Найти цитируемый пост)
Если я сделал все правильно, код ошибки 0x5 

Number: 5
Constant: ERROR_ACCESS_DENIED

Проблема в первом аргументе функции 
Цитата(freezeman @  25.3.2012,  13:01 Найти цитируемый пост)
CreateEvent (NULL, true, false, TEXT("MyEvent\0")); 

там должны быть нормальные аттрибуты, а не NULL

Верней даже не здесь, а в основной программе, которая и создает первый евент.

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

Как вы говорите о параметре в CreateEvent, почему же в другом проекте все заработало??
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.1110 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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