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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация потоков 
:(
    Опции темы
dips
Дата 12.5.2006, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



"Синхронизация задач нескольких MDI-приложений с помощью ожидаемого таймера с автосбросом, который срабатывает через промежутки времени равные 1,5 секундам" - это вообще как??
Если есть примеры на эту тему буду рад...
да и вообще если есть что нибудь про синхронизацию, мне ещё семафоры вроде как нужны 
PM MAIL   Вверх
Fazil6
Дата 12.5.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



только у тебя не синхронизация потоков, а синхронизация процессов

Здесь статья, в которой есть все по этой теме
Процессы, потоки, синхронизация 
PM MAIL   Вверх
dips
Дата 12.5.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чего то у меня всё равно не выходит...вот процедура

Код


DWORD WINAPI ThreadProc(Void)
{
        int h = Main->ThrBox->Items->Strings[Main->ThrBox->Count - 1].ToInt();//хэндл текущего потока
        int id,j = 0,count = 0;
        HANDLE H[MAXTHR]; ////////////массив хэндлов процессов которые потом ждать
        for(int i = 0;i < Main->ThrBox->Count;i++)//я в него загоняю все нити кроме
        {//собственно текущей
                if(Main->ThrBox->Items->Strings[i].ToInt()!=h)
                {
                        H[j] = HANDLE(Main->ThrBox->Items->Strings[i].ToInt());
                        j++;
                }
        }
        randomize();
        int color = random(10000000);
        while(true)
        {
                HANDLE hTimer = CreateWaitableTimer(NULL,FALSE,NULL);
                SetWaitableTimer(hTimer,0,1500,0,0,0);//вот тут я не совсем понял со вторым аргументом
                WaitForMultipleObjectsEx(Main->ThrBox->Count - 2,H,FALSE,INFINITE,TRUE);
                Main->ThTC->Canvas->Brush->Color = color;
                Main->ThTC->Canvas->Rectangle(random(Main->ThTC->Width),
                random(Main->ThTC->Height),random(Main->ThTC->Width),random(Main->ThTC->Height));
                Main->ThTC->Canvas->Ellipse(random(Main->ThTC->Width),
                random(Main->ThTC->Height),random(Main->ThTC->Width),random(Main->ThTC->Height));
                Main->ThTC->Canvas->TextOutA(random(Main->ThTC->Width),
                random(Main->ThTC->Height),random(1000000));
                Main->StatusBar->SimpleText = IntToStr(h);
                count++;
                id = Main->ThrBox->ItemIndex;
                if(id!=-1 && Main->ThrBox->Items->Strings[Main->ThrBox->ItemIndex].ToInt()==h)
                        Main->ValBox->Items->Strings[id] = IntToStr(count);
                Sleep(1000);
                CancelWaitableTimer(hTimer);
        }
}

я вообще так делаю? я не совсем понял где должны CreateWaitableTimer SetWaitableTimer
 и CancelWaitableTimer собственно располагаться... подскажи плиз мне надо синхронизировать
MAXTHR потоков 
PM MAIL   Вверх
buslove
Дата 14.5.2006, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А не проще ли использовать критическую секцию? 
PM MAIL   Вверх
_hunter
Дата 15.5.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



для процессов -- не проще 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
dips
Дата 15.5.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проще, не проще... Ну так кто нибудь знает как?
Я чего то совсем запутался... 
PM MAIL   Вверх
Earnest
Дата 15.5.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Не совсем понятно, что значит "Синхронизация задач нескольких MDI-приложений". Что нужно делать-то через каждые полторы секунды? Передавать управление очередному приложению?
Код твой вообще никакого отношения к MDI-приложениям не имеет. 

Но в любом случае, если речь идет об отдельных процессах, то а) создавать нужно именованный таймер (в одном из процессов), b) в других - доступаться к нему через OpenWaitableTimer.
с) где-то нужно его и удалить (по окончанию работы).

Может речь о том, что нужно написать отдельный диспетчер, который управляет таймером и MDI-задачами? 


--------------------
...
PM   Вверх
dips
Дата 15.5.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



То есть точно так же как допустим критическая секция?
Вот допустим я при создании формы создам таймер,
и в ThreadProc сдеоаю что то типа
while(true)    
        {
OpenWaitableTimer
....
....
        }

ну где уалю эт не вопрос, вопрос в том что он должен передавать управление другому потоку через 1,5 секунды,
а он при таком раскладе этого не выполняет 
PM MAIL   Вверх
dips
Дата 15.5.2006, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем огромное спасибо за участие!
Я наконец то разобрался, я допустил 2 ошибки из за которых у меня ничего работать то и не могло.
Во первых я вместо
Код

LARGE_INTEGER liDueTime;
SetWaitableTimer(hTimer,&liDueTime,1500,0,0,0);
 
сделал 
Код

SetWaitableTimer(hTimer,0,1500,0,0,0);
 
Посему таймер не запускался вообще,
а потом в ТриадПроц я забыл вставить
[code=cpp]
WaitForSingleObject(hTimer,INFINITE);
[code=cpp]
я сразу писал
Код

OpenWaitableTimer(TIMER_MODIFY_STATE,true,"MyTime");
 
вот ничего и не работало8) ещё раз всем спасибо!!! 
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.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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