Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
ProgRoman
1 / 1 / 0
Регистрация: 04.12.2010
Сообщений: 66
#1

Поток не сигнализирует событием о своем окончании - C++

10.10.2014, 14:47. Просмотров 399. Ответов 5
Метки нет (Все метки)

Всем привет, нужна помощь задача такая. Есть метод у меня (mnThread) который постоянно поставляет данные, процедура (get_data) эти данные получает. Как только данные получены я устанавливаю событие и по идее должен перейти к другому методу по обработке данных.. Но что-то идёт не так.. максимум попадаю я в метод обработки (process) только один раз, почему пока не понимаю... ниже код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
static int count_calls = 0;
 
class Test
{
public:
    HANDLE hEvent;
    HANDLE hProc;
    HANDLE hmutx;
    CRITICAL_SECTION cr;
    CRITICAL_SECTION cs;
    //CRITICAL_SECTION cc;
    int a;
    std::string a_str;
 
public:
    Test();
    ~Test();
 
    static void get_data(void* params); 
    static void process(void* params);
};
 
Test::Test()
{
    //InitializeCriticalSection(&cc);
    //EnterCriticalSection(&cc);
 
    a = 0;
    a_str = "";
    DWORD id = 0;
 
    hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);    
 
    //hProc = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)process,this, 0, &id ); ///1
    hProc = (HANDLE)_beginthread(&Test::process,0,this);    
 
    InitializeCriticalSection(&cr);
    InitializeCriticalSection(&cs);
 
    //LeaveCriticalSection(&cc);
 
    std::cout<<"TEST()\n";
}
 
Test::~Test()
{
    //EnterCriticalSection(&cc);
 
    CloseHandle(hEvent);    
 
    hEvent = NULL;  
 
    CloseHandle(hProc);
    hProc = NULL;
    _endthread();
    DeleteCriticalSection(&cr);
    DeleteCriticalSection(&cs);
 
    //LeaveCriticalSection(&cc);
    //DeleteCriticalSection(&cc);
    std::cout<<"~TEST()\n";
}
 
void Test::get_data(void* params)
{
    if(!params){return;}
 
    Test* tm = (Test*)params;
    EnterCriticalSection(&tm->cr);  
    count_calls++;
    tm->a = count_calls;
 
    SetEvent(tm->hEvent);
    LeaveCriticalSection(&tm->cr);
 
    //tm->hProc = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)process,tm, 0, NULL );///2
}
 
void Test::process(void* params)
{
    if(!params){return;}
    Test* tm = (Test*)params;
 
    if(WaitForSingleObject(tm->hEvent,INFINITE)==WAIT_OBJECT_0)
    {
        EnterCriticalSection(&tm->cs);
        int cnt = tm->a;
        char buf[50];
        tm->a_str = "It's call number of " +std::string(itoa(cnt,buf,10));
        std::cout<<tm->a_str<<"\n";     
        LeaveCriticalSection(&tm->cs);
    }
}
 
static void mnThread(void* params)
{
    if(!params){return;}
    Test* tm = (Test*)params;
 
    while(1)
    {/**/
        tm->get_data(&tm);
    }
 
}
 
int main(int argc, char* argv[])
{
    Test ts;        
    mnThread(&ts);
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2014, 14:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поток не сигнализирует событием о своем окончании (C++):

Антивирус касперский сигнализирует о вирусной угрозе в прогграмме по задаче 7 глава 8 (С++ Р. Лафоре) - C++
решаю задачу из книги Р. Лафоре С++Объектно-ориентированное программирование и вот 7 задачу из главы 8 касперский решитьельно не хочет...

Разработать программу, в которой основной поток, принимает поток ввода и контролирует созданные потоки. - C++ Linux
что-то не-то с кодом. 2 дня ломаю голову :( //#define _REENTRANT #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; ...

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся. - C++
В функции треда создал буфер char tbuf;но после того как тред выполнился выскочила ошибка Run-Time Check Failure #2 - Stack around the...

Закрыть поток перед событием FormClosing - C#
В Form1 реализуются два потока: public Form1() { Thread Listener = new Thread(ListenerIP); Thread...

abit sl6 Сигнализирует - Материнские платы
abit sl6 пытался запустить материку,переключатели были выставлены не правильно и на материнке отсуствуют перемычки...В данный момент...

Два жёстких диска - Windows 10 сигнализирует о неполадках - Жесткие диски
Решил поставить Windows 10, сохранив Windows 7. Купил новый HDD, подключил его, временно отключил старый, установил Windows 10 на новый....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aloir
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
10.10.2014, 17:42 #2
ProgRoman, потому, что вот тут вы создаете поток:
C++
1
  hProc = (HANDLE)_beginthread(&Test::process,0,this);
тут, поток дожидается сигнала от события:
C++
1
if(WaitForSingleObject(tm->hEvent,INFINITE)==WAIT_OBJECT_0)
и потом отрабатывает и завершается.

т.е дальнейшие вызовы вашего get_data, никому уже не сигнализируют
0
ProgRoman
1 / 1 / 0
Регистрация: 04.12.2010
Сообщений: 66
10.10.2014, 18:03  [ТС] #3
я только начинаю разбираться с потоками, поэтому возможно вопросы глупые,но всё же) почему он(поток) завершается, я думал тут
C++
1
if(WaitForSingleObject(tm->hEvent,INFINITE)==WAIT_OBJECT_0)
он ждёт сигнала от события, приходит событие метод отрабатывает в потоке. Завершается метод, а поток остаётся висеть и как я понимаю он должен ждать следующего сигнала от события, но происходит действительно как говорите вы, событие устанавливается, а в метод (process) не попадаю... как исправить этот недостаток?
0
ProgRoman
1 / 1 / 0
Регистрация: 04.12.2010
Сообщений: 66
13.10.2014, 14:21  [ТС] #4
Правильно я понимаю т.е. что бы всё корректно работало надо поток создавать не в конструкторе, а в методе get_data (у меня там последняя строка создание потока закомментирована) меня единственно что смущает в этой записи так это то что каждый раз при попадании в метод get_data будет создаваться новый поток таким образом как я думал это не очень хорошо.. но создавать поток в конструкторе что-то не получается не совсем понятно почему так..
0
DrOffset
7142 / 4283 / 966
Регистрация: 30.01.2014
Сообщений: 7,086
19.10.2014, 21:58 #5
Цитата Сообщение от ProgRoman Посмотреть сообщение
как исправить этот недостаток?
Использовать цикл.
Функция потока не будет "висеть" и "ждать", если ты сам не пропишешь ей такое поведение. Нужен цикл, и одно событие зарезервировать для обеспечения корректного завершения потока (выхода из цикла).
0
ProgRoman
1 / 1 / 0
Регистрация: 04.12.2010
Сообщений: 66
20.10.2014, 16:09  [ТС] #6
Ок спасибо большое уже разобрался, всё сделал получилось!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2014, 16:09
Привет! Вот еще темы с ответами:

Acer 5742g отказывается запускаться не запускается, сигнализирует 5-и разовым миганием индикатора работы - Ремонт ноутбуков
Итак, отказ запускаться. Сигнализирует 5-и разовым миганием индикатора работы. При попытке поставить на зарядку индикатор зарядки молчит. ...

работа с событием - C#
Не очень понимаю как это реализуется. У меня есть драйвер по работе с весами , подключил его как службу. В описании драйвер посылает...

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается - Delphi
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной которой было присвоен этот поток, не...

Работа с событием click - jQuery
Привет. Такой вопрос: Мне нужно сделать выпадающий список при нажатии на кнопку как на Gmail. И у меня возник вопрос как можно сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.10.2014, 16:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru