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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, Куда прикрутить потоки 
:(
    Опции темы
DareL
Дата 9.3.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Посоветуйте, пожалуйста.
Прохожу WinApi.
Дали следующее заданик:

Цитата

Разработать многопоточное приложение, осуществляющее генерирование случайных чисел с нормальным законом распределения. Предусмотреть возможность сохранения выборок этих чисел в файлах и обработки чисел (например,  сортировку).  Подобрать примеры, которые наглядно демонстрируют работу созданного приложения. Оценить преимущества использования нескольких потоков для работы данного приложения.


Где и как тут можно использовать потоки?
PM MAIL ICQ   Вверх
Lazin
Дата 9.3.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



делишь массив на N частей, первую часть заполняешь из первого потока, вторую из второго и тд...
PM MAIL Skype GTalk   Вверх
ilyuha
Дата 9.3.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а что конкретно не понятно, какие подзадачи выделять в отдельные потоки, или, непосредственно, сама реализация?
PM MAIL   Вверх
GoldFinch
Дата 9.3.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(DareL @  9.3.2009,  13:14 Найти цитируемый пост)
Оценить преимущества использования нескольких потоков для работы данного приложения.

какие могут быть преимущества у такого надуманного примера %)
PM MAIL ICQ   Вверх
DareL
Дата 9.3.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ilyuha @  9.3.2009,  13:44 Найти цитируемый пост)
а что конкретно не понятно, какие подзадачи выделять в отдельные потоки, или, непосредственно, сама реализация?

Какие подзадачи выделить.
С реализацией я, надеюсь, разберусь
PM MAIL ICQ   Вверх
zim22
Дата 9.3.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



потоки можно использовать на этапе сортировки.
первый поток один кусок массива сортирует, второй - другой.


--------------------
PM MAIL   Вверх
Artemon
Дата 10.3.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Просто сделай в потоке генерацию случайных числел, а в главном потоке выводи их на форму.

Вот тебе и 2 потока.

Подсказка:

Межпоточное взаимодействие сделай через WM_COPYDATA


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
GoldFinch
Дата 10.3.2009, 14:10 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Artemon @  10.3.2009,  13:29 Найти цитируемый пост)
WM_COPYDATA 

зачем такой изврат %) подойдет обычная глобальная структура типа массива

вся выборка сгенерится быстрее чем сработает WM_COPYDATA
PM MAIL ICQ   Вверх
Artemon
Дата 10.3.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Если мы используем глобальные объекты для потоков, то необходима синхронизация.
Отсюда следует что топикстартеру нужно разобираться с межпроцессным взаимодействием, а я думаю это больший геморой, чем использовать WM_COPYDATA в данном случае.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Lazin
Дата 10.3.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Artemon @  10.3.2009,  17:16 Найти цитируемый пост)
Если мы используем глобальные объекты для потоков, то необходима синхронизация.

не обязательно
если к примеру нужно просто заполнить массив случайными числами, то
1. определяем число процессоров - cpu_count
2. делим массив на cpu_count частей
3. создаем cpu_count потоков, в качестве параметра, передаем в каждый поток начальный и конечный индексы массива, в которые поток должен записывать данные, а так-же указатель на сам массив( либо пару указателей)
4. ждем завершения потоков
5. получаем прирост производительности cpu_count*100% - x
Quick sort и merge sort то-же неплохо можно распараллелить...
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 10.3.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Artemon @  10.3.2009,  17:16 Найти цитируемый пост)
с межпроцессным взаимодействием,

каким еще межпроцессным? там потоки а не процессы
PM MAIL ICQ   Вверх
Artemon
Дата 11.3.2009, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Lazin, твой способ подойдет только для случая, когда мы один раз заполним массив и закончим потоки, НЕ выводя циклически данные в основной поток. Иначе нам всеравно придется использовать синхронизацию.

Цитата

каким еще межпроцессным? там потоки а не процессы


Конечноже межпоточным, опечатался.


Это сообщение отредактировал(а) Artemon - 11.3.2009, 07:24


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
GoldFinch
Дата 11.3.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Artemon, синхронизация осуществляется оборачиванием кода в критические секции, это куда как проще и прозрачнее чем посылать сообщения
и где вообще сказано что в программе должно быть окно?
PM MAIL ICQ   Вверх
Lazin
Дата 11.3.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(DareL @  9.3.2009,  13:14 Найти цитируемый пост)
Разработать многопоточное приложение, осуществляющее генерирование случайных чисел с нормальным законом распределения.

основной поток запускает потоки и ждет пока они отработают, после чего может дальше работать, зачем здесь синхронизация?
Код

#include <iostream>
#include <stdio.h>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/thread/thread.hpp>
#include <algorithm>
#include <windows.h>


int get_cpu_count()
{
    SYSTEM_INFO info;
    ZeroMemory(&info, sizeof(SYSTEM_INFO));
    GetSystemInfo(&info);
    return info.dwNumberOfProcessors;
}


int main()
{
    std::vector<int> random_samples(100000);
    int cpu_count = get_cpu_count();
    boost::thread_group tasks;
    for(int i = 0; i < cpu_count; ++i)
    {
        tasks.create_thread( boost::bind( &std::generate<std::vector<int>::iterator, int ( void ) >
                                        , random_samples.begin() + (i*random_samples.size())/cpu_count
                                        , random_samples.begin() + ((i + 1)*random_samples.size())/cpu_count
                                        , &rand) 
                                        );
    }
    tasks.join_all();
}

PM MAIL Skype GTalk   Вверх
C/L
Дата 11.3.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Lazin @  11.3.2009,  11:39 Найти цитируемый пост)
ждет пока они отработают

наверно это и есть синхронизация, только посредством tasks.join_all().
PM MAIL WWW ICQ   Вверх
Lazin
Дата 11.3.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(C/L @  11.3.2009,  10:27 Найти цитируемый пост)
наверно это и есть синхронизация, только посредством tasks.join_all()

рабочие потоки в данном случае синхронизировать ну нужно, только основной поток
PM MAIL Skype GTalk   Вверх
Artemon
Дата 11.3.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Цитата

синхронизировать ну нужно,

Об этом и речь smile

Да в вашем примере синфхронизация не нужна, но как вы поступите, если нам постоянно потребуется вести расчет в потоках и постоянно выводить результаты, это я к тому, что не возможно этот сделать без синхронизации.


Цитата

Artemon, синхронизация осуществляется оборачиванием кода в критические секции, это куда как проще и прозрачнее чем посылать сообщения


Это субъективное мнение.

Цитата

и где вообще сказано что в программе должно быть окно?


Про окно значит не сказано, а boost  значит впорядке вещей получается ?



Это сообщение отредактировал(а) Artemon - 11.3.2009, 12:00


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
mrbrooks
Дата 11.3.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(Artemon @  11.3.2009,  11:54 Найти цитируемый пост)
Про окно значит не сказано, а boost  значит впорядке вещей получается ?

у Lazina - да. Я к этому уже привык.  smile 
PM MAIL   Вверх
Lazin
Дата 11.3.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Artemon @  11.3.2009,  11:54 Найти цитируемый пост)
но как вы поступите, если нам постоянно потребуется вести расчет в потоках и постоянно выводить результаты, это я к тому, что не возможно этот сделать без синхронизации

речь идет об одном конкретном примере, если будет что-то другое, то будет и другое решение. В данном случае, пока потоки не отработают, с массивом нельзя работать и никакие расчеты невозможны. Если, к примеру, нам нужно отсортировать полученный массив, нам придется ждать генерации всех элементов массива, затем начинать сортировку. Можно вместо сортировки вставлять элементы в бинарное дерево поиска, например std::set, тогда сортировать не нужно, но тогда нужно будет синхронизировать доступ к этому дереву.

Добавлено через 1 минуту и 4 секунды
в любом случае, обмен сообщениями между потоками - не самый эффективный механизм, особенно когда объем обрабатываемых совместно данных велик

Добавлено через 3 минуты и 35 секунд
кстати, для того что-бы использовать WM_COPYDATA нужно создавать окно, послать такое сообщение потоку нельзя
вместо этого, я бы завел очередь, в одном потоке добавлял в нее данные, а из другого читал, ну и естественно оповещал бы поток - потребитель о приходе новых данных с помощью события...
PM MAIL Skype GTalk   Вверх
Artemon
Дата 11.3.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Да, большой объем прогонять через WM_COPYDATA не эффективно.
Но еслиже у нас маленькое приложение и объем данных мизерный, то моему лучше сделать чрез WM_COPYDATA.
Просьба не начинать спор с начала, думаю что все остались при своих мнениях.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
GoldFinch
Дата 11.3.2009, 13:00 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Artemon, какие тогда преимущества дает многопоточность, если юзать WM_COPYDATA?
PM MAIL ICQ   Вверх
Lazin
Дата 11.3.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



естественно никакие, так-как это сообщение можно послать только с помощь ф-ии SendMessage, которая работает синхронно... если и посылать сообщения потокам, то только через PostThreadMessage
PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 11.3.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



На самом деле тему раздули - молодцы. Не проще ли автору посоветовать почитать Рихтера главу про потоки и их синхронизацию? На мой взгляд все достаточно доступно и доходчиво.
PM MAIL   Вверх
Artemon
Дата 11.3.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



1. Если мы пишем для Windows, используя к примеру WinApi, у нас уже и так есть оконная процедура и с минимальными усилиями мы можем добавить обработку собщения WM_COPYDATA.

2. Если нам необходимо вывести данные из второстепенных потоков в окно.

Цитата

естественно никакие, так-как это сообщение можно послать только с помощь ф-ии SendMessage,


И что с того, что можно послать только через SendMessage ?
Если нужно работать с GUI, это очень даже приемлимый способ.

У меня создалось впечатление, что вы думаете мое предложение - использовать взаимодействие через WM_COPYDATA между второстепенными потоками, нет это не так. Я передлагаю использовать WM_COPYDATA только для взаимодействия второстепенного и главного потоков для дальнейшего вывода информации в GUI.



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
GoldFinch
Дата 11.3.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Artemon, кроме GUI прог в винде есть еще и консольные проги, а еще есть проги без окна и без консоли
PM MAIL ICQ   Вверх
Artemon
Дата 11.3.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Неужели? А еще есть драйвера, работающие в нулевом кольце. Которые тоже могут использовать потоки.

Только я не пойму вообще к чему это ты сказал.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Lazin
Дата 11.3.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Artemon @  11.3.2009,  14:34 Найти цитируемый пост)
Неужели? А еще есть драйвера, работающие в нулевом кольце. Которые тоже могут использовать потоки.

вообще-то, даже в GUI приложениях в основном потоки используют общие данные и синхронизируют их с помощью различных примитивов синхронизации, и ооочень редко используется WM_COPYDATA smile 
WM_COPYDATA обычно используют для организации взаимодействия процессов, тогда, когда оно должно-быть синхронным.
PM MAIL Skype GTalk   Вверх
Artemon
Дата 11.3.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Вот ты мне объясни, зачем мне нужна синхронизация, если я один раз из потока в окно хочу одну строку вывести ? Мне очень удобно это сделать через SendMessage + WM_COPYDATA

Реальный пример:

Программа, которая производит спам рассылку, у которой 4 потока:

1. Сбор IP
2. Проверка IP (является ли этот адрес прокси сервером)
3. Распознавание капчи
4. Основной поток.

Все потоки синхронизованы через Mutex-ы

И вот например случается событие в потоке проверки IP (№2), о котором мне необходимо информировать пользователя. Я беру и кидаю строку через SendMessage + WM_COPYDATA, в главном окне ловлю его и отображаю в поле статистики.

Зачем мне сдалась какая-либо синхронизация, касающаяся вывода сообщений пользователю.
//-------------------------------------------------------------------------------------------
Про автора топика совсем забыл, у тебя GUI или консольное приложение ?
Если GUI, то советую сделать так, как я предложил, если консольное - возьми исходник Лазина.


Это сообщение отредактировал(а) Artemon - 11.3.2009, 15:11


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
GoldFinch
Дата 11.3.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Artemon, ты жжошь
безусловно формошлепство накладывает некоторый оконный отпечаток на личность)

Добавлено через 1 минуту и 2 секунды
еще можно отправлять данные на почту по POP3 и читать от туда другим потоком
PM MAIL ICQ   Вверх
Lazin
Дата 11.3.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(GoldFinch @  11.3.2009,  15:20 Найти цитируемый пост)
еще можно отправлять данные на почту по POP3 и читать от туда другим потоком 

я хотел предложить записывать данные в файл одним потоком и читать их оттуда другим, но ты меня обошел))
Цитата(MSDN)

An application sends the WM_COPYDATA message to pass data to another application.
еще вопросы? smile

Добавлено через 3 минуты и 24 секунды
Цитата(Artemon @  11.3.2009,  14:58 Найти цитируемый пост)
Программа, которая производит спам рассылку, у которой 4 потока:

1. Сбор IP
2. Проверка IP (является ли этот адрес прокси сервером)
3. Распознавание капчи
4. Основной поток.

Все потоки синхронизованы через Mutex-ы

И вот например случается событие в потоке проверки IP (№2), о котором мне необходимо информировать пользователя. Я беру и кидаю строку через SendMessage + WM_COPYDATA, в главном окне ловлю его и отображаю в поле статистики.

Зачем мне сдалась какая-либо синхронизация, касающаяся вывода сообщений пользователю.

с данной программой все просто, ее просто не надо писать smile 

Цитата(Artemon @  11.3.2009,  14:58 Найти цитируемый пост)
Если GUI, то советую сделать так, как я предложил, если консольное - возьми исходник Лазина.

блин, откуда вы все знаете мою фамилию? smile 

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


а ты мне нравишься
***


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

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



Если вы мне предложите более лаконичное решение примера, который я привел (конечно же обоснованное решение), то я соглашусь с вами, сейчас получается все на уровне разговора без аргументов (особенно GoldFinch)

Добавлено через 1 минуту и 54 секунды
Цитата

с данной программой все просто, ее просто не надо писать   smile 


Ну ты тоже скажешь, это мой хлеб практически.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
GoldFinch
Дата 11.3.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Lazin @  11.3.2009,  15:33 Найти цитируемый пост)
блин, откуда вы все знаете мою фамилию?

тут полфорума - экстрасенсы

синхронизация через критические секции выглядит так

Код

... foo(...) //функция или метод которая должна быть синхронной
{
  Synchronizer SinchronizeMe(); //заклинание которое оборачивает функцию в критическую секцию
  ... //тут работаем с данными (читаем или пишем)
};

- лаконичнее некуда  - 1 строчка на то чтобы сделать функцию thread-safe

неужели WM_COPYDATA в каком-то месте удобнее?

Это сообщение отредактировал(а) GoldFinch - 11.3.2009, 15:48
PM MAIL ICQ   Вверх
Artemon
Дата 11.3.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Критическая секция - это как говорится хорошо,

Покажи мне пример в котором из вторичного потока выводятся данные в Windows окно.

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

Это сообщение отредактировал(а) Artemon - 11.3.2009, 16:08


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Lazin
Дата 11.3.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Код

//общие данные
std::list<std::string> queue;
boost::mutex mutex;
UINT user_msg = RegisterWindowMessage("my message");
//поток
void thread()
{
     ...чет фигня какая-то случилась, надо сообщить пользователю...
    {
        boost::mutex::scoped_lock lock(mutex);
        queue.push_back( std::string("message") );
        PostMessage(window_handle, user_msg, 0, 0);
    }
}


//обработчик сообщений
while(GetMessage(msg, 0, 0))
{
    ....
    if(msg.message == user_msg)
    {
        std::string message;
        {
        boost::mutex::scoped_lock lock(mutex);
        message = queue.back(); 
        queue.pop_back();
        }
    ...показываем сообщение...
    }
}

Цитата(Artemon @  11.3.2009,  15:41 Найти цитируемый пост)
Ну ты тоже скажешь, это мой хлеб практически

а как-же вечные муки в аду? smile 
PM MAIL Skype GTalk   Вверх
Artemon
Дата 11.3.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Ну вот ты используешь PostMessage + Сообщение + Mutex
И чем оно лучше SendMessage + Сообщение ?
Вообще в упор не вижу никаких плюсов.

Добавлено через 33 секунды
Цитата

а как-же вечные муки в аду?  smile 


Все там будем...



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Lazin
Дата 11.3.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Artemon @  11.3.2009,  16:32 Найти цитируемый пост)
Вообще в упор не вижу никаких плюсов.

твои проблемы)
Цитата(Artemon @  11.3.2009,  16:32 Найти цитируемый пост)
И чем оно лучше SendMessage + Сообщение ?

тем, что в случае SendMessage, поток вызвавший SendMessage будет ждать пока не отработает оконная процедура, а в моем коде этого не будет
PM MAIL Skype GTalk   Вверх
Artemon
Дата 11.3.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Единственное в чем с тобой согласен это:

Цитата

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



Но опятьже, я вызываю SendMessage довольно редко и для меня это не критично.



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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