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

Синхронизация потоков, события, WinAPI - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Напишите программу, которая использует три определяемых пользователем функции (включая main ()) http://www.cyberforum.ru/cpp-beginners/thread932454.html
Напишите программу на C++, которая использует три определяемых пользователем функции (включая main ()) и генерирует следующий вывод: Three blind mice Three blind mice See how they run See how they run Где то ошибка в 23 строке.
C++ Чем плохой указатель на void? Здравствуйте! Недавно прочитал статью на хабре http://habrahabr.ru/post/102930/ Сабж - архитектура игрового двигла, а именно менеджер состояний. В нем используется указатель на войд. Вот внизу комментарии есть, что это все сплошной говнокод и указатель такой нельзя юзать в большом проекте. Объясните мне, почему? Что же такого страшного в использование такого указателя не только в данной статье, а... http://www.cyberforum.ru/cpp-beginners/thread932453.html
C++ Получения спектра сигнала
Вообщем есть функция сигнала (допустим синус на синус с разными частотами) и теперь мне надо сделать вывод как на спектроанализаторе - что бы выдал два всплеска на этих частотах. Я понимаю что надо использовать FFT(БПФ) но как именно не совсем понимаю. Входные данные у меня x и y. Как мне их использовать? p.s. Буду рад любой информации.
C++ Не срабатывает вложенные If/else
Написал программу, в программе в цикле while есть большой список if/else который по величине SS суммирует определенные ячейки массива sales. Если мы вводим, например, 2000, то переменная SS получается равна 200 + 0.09 * 2000 = 380, следовательно ячейка массива sales должна увеличиваться на 1, но она почему то не увеличивается. Аналогична ситуация с остальными ячейками, подскажите, в чем ошибка ?...
C++ Удалить повторяющиеся элементы в отсортированнном массиве http://www.cyberforum.ru/cpp-beginners/thread932413.html
пример такого массива I={0,1,3,3,3,5,6,8,10,10} Т.е. я так понимаю, нужно сдигать все элементы при повторении влево, и записывать в инт количество таких сдвижек, что бы передать массив в буферный и освободить лишнюю память. Что то туплю, и не могу понять как это "дешевле" сделать...На ум приходит только цикл в цикле.... может подскажите? Добавлено через 16 минут Пройтись один раз по...
C++ wchar_t. Вместо буквы выводится число Почему такой результат? #include <iostream> int main() { wchar_t letter=L'Z'; std::cout << "letter = " << letter << std::endl; // letter = 90 подробнее

Показать сообщение отдельно
udjee
0 / 0 / 0
Регистрация: 15.08.2012
Сообщений: 6
02.08.2013, 12:33     Синхронизация потоков, события, WinAPI
Уважаемые программисты!
Решается такая задача: 5 потоков генерируют псевдослучайные числа, главный поток выводит их, при нажатии "enter" все должно быть остановлено и выведена сумма всех этих чисел.
Я написала это так:
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
#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <ctime> 
#define n 5
int i, data[n]; //i-я ячейка массива соответствует i-му потоку
HANDLE hThread[n], hEvent1, hEvent2;
DWORD  hThreadID[n];
 
void Func (void * pParams) // стартовая функция потоков
{
    srand(GetCurrentThreadId()+time(0));
    while (1)
    { 
        WaitForSingleObject( hEvent2, INFINITE );
        *((int*)pParams) = rand()%100;
        SetEvent( hEvent1 );
    }
}
 
void main()
{
    int sum = 0; // переменная, хранящая сумму всех выводимых чисел
    for(i = 0; i < n; i++)
        data[i] = 0;
 
    hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL );
    hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL );
 
    for(i = 0; i < n; i++)
        hThread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func, &data[i], 0, &hThreadID[i]);
    
    while(1)
    {
        WaitForSingleObject( hEvent1, INFINITE );
        for(i = 0; i < n; i++)
            sum += data[i];
        printf("%d %d %d %d %d\n", data[0], data[1], data[2], data[3], data[4]);
        SetEvent( hEvent2 );
        if(GetAsyncKeyState(VK_RETURN)) // при нажатии клавиши "enter" потоки останавливается, выводится сумма
        {
            for(i = 0; i < n; i++)
                SuspendThread(hThread[i]);
            for(i = 0; i < n; i++)
                WaitForSingleObject(hThread[i], 1000); // ждем пока потоки выведут последние числа
            printf("Summ = %d\n", sum);
        }
    }
    for(i = 0; i < n; i++)
        CloseHandle(hThread[i]);
}
В результате получаю либо:
Синхронизация потоков, события, WinAPI
либо:
Синхронизация потоков, события, WinAPI
что не есть правильно.

Подскажите, пожалуйста, как избавиться от последней ситуации?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru