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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация критическими секциями, Синхронизация критическими секциями 
:(
    Опции темы
Abbath1349
Дата 7.1.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

TCHAR str[255];
int maxX,maxY,randle;
int X=0,Y=0;
CRITICAL_SECTION fs;
HDC memdc;
HBITMAP hBit;
HBRUSH hBrush;
HANDLE hThread,hThread2;


unsigned __stdcall MyThread1(void* param)
{
    
    int i;
    
    TEXTMETRIC tm;
    GetTextMetrics(memdc,&tm);
    for(i=0;i<10;i++)
    {
        EnterCriticalSection(&fs);
        Sleep(500);
        randle=rand()%254;
        LeaveCriticalSection(&fs);
    }
    
    return 0;
}

unsigned __stdcall MyThread2(void* param)
{
    
    int i;
    TEXTMETRIC tm;
    GetTextMetrics(memdc,&tm);
    for(i=0;i<10;i++)
    {
        EnterCriticalSection(&fs);
        Sleep(500);
        wsprintf(str,_T("Поток 1 сигнал %d"),randle);
        TextOut(memdc,X,Y,str,_tcslen(str));
        Y=Y+tm.tmHeight+tm.tmExternalLeading;
        InvalidateRect((HWND)param,NULL,TRUE);
        LeaveCriticalSection(&fs);
    }
    
    return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    PAINTSTRUCT ps;
    HDC hdc;
    
    switch (message)
    {
    case WM_CREATE:
        maxX=GetSystemMetrics(SM_CXSCREEN);
        maxY=GetSystemMetrics(SM_CYSCREEN);
        hdc=GetDC(hWnd);
        memdc=CreateCompatibleDC(hdc);
        hBit=CreateCompatibleBitmap(hdc,maxX,maxY);
        SelectObject(memdc,hBit);
        hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
        
        SelectObject(memdc,hBrush);
        PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
        ReleaseDC(hWnd,hdc);
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case ID_THREAD:
            InitializeCriticalSection(&fs);
            hThread=(HANDLE)_beginthreadex(NULL, 0, MyThread1, hWnd, 0, NULL);
            hThread2=(HANDLE)_beginthreadex(NULL, 0, MyThread2, hWnd, 0, NULL);
            InvalidateRect(hWnd,NULL,TRUE);
            break;
        }
        break;

    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
        LeaveCriticalSection(&fs);
        EndPaint(hWnd, &ps);
        break;
    case WM_LBUTTONDOWN:
        X=LOWORD(lParam);
        Y=LOWORD(lParam);
        break;
    case WM_DESTROY:
        DeleteCriticalSection(&fs);
        DeleteDC(memdc);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}



Это сообщение отредактировал(а) Abbath1349 - 7.1.2011, 15:04
PM MAIL   Вверх
GremlinProg
Дата 7.1.2011, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



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

но телепатически можно решить, что потоки делят время неравномерно, т.е. просыпаются не через каждые 500мс,

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Abbath1349
Дата 7.1.2011, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну проблема в том,что он не чего не выводит. А сделать надо ,чтоб они синхронно первый получает случайное число второй его выводит на экране оно появляется раз в секунду.
PM MAIL   Вверх
GremlinProg
Дата 8.1.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Abbath1349 @  7.1.2011,  17:03 Найти цитируемый пост)
case ID_THREAD:

а потоки-то запускаются?

на первый взгляд, рисоваться хоть что-то, но должно, если они запущены


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Abbath1349
Дата 8.1.2011, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если EnterCriticalSection(&fs); и  LeaveCriticalSection(&fs); убрать то работает,а так нет
PM MAIL   Вверх
Dreamer_0x01
Дата 8.1.2011, 17:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



У вас никак не определена очередность захода в критические секции и прядок выполнения дйствий.

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

Добавлено через 2 минуты и 47 секунд
Чтобы выяснить, в каком порядке выполняются ваши действия, добавьте внутрьцикла нечто вроде
Код

TRACE1("Thread 1, iteration %d",i);

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


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Abbath1349
Дата 10.1.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



TRACE1 это откуда можно взять?
PM MAIL   Вверх
Dreamer_0x01
Дата 10.1.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Abbath1349 @  10.1.2011,  11:08 Найти цитируемый пост)
TRACE1 это откуда можно взять?


что-то не сообразил, это макрос из mfc.
Замените тогда его на вывод на консоль через printf или что-то похожее.
Суть не в самом методе вывода информации куда-либо, а в том, чтобы убедиться в том, в какой последовательности выполняются итерации в потоках.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
GremlinProg
Дата 10.1.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Abbath1349 @  10.1.2011,  13:08 Найти цитируемый пост)
TRACE1 это откуда можно взять?

например так:
Код

#include <crtdbg.h>
...
_RPT1( _CRT_WARN, "Thread 1, iteration %d\r\n", i );

это выведет строку в output MSVS,
оч. удобно, если проект GUI'шный


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 12.1.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



и уж совсем хорошо так:
Код

_RPT1( _CRT_WARN, "%hs(%i): Thread 1, iteration %d\r\n", __FILE__, __LINE__, i );

чтобы не терять в коде места, где эти трейсы расставлены


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 13.1.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



вот еще один аналог _RPTx, но с более удобным интерфейсом:
Код

#define TRACE( format, ... ) _CrtDbgReport( _CRT_WARN, __FILE__, __LINE__, NULL, format, __VA_ARGS__ )

p.s.: __VA_ARGS__ работает, начиная с Visual C++ 2005


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0715 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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