FreeBASIC в России

   

 Главная   Исходники   Русскоязычный форум   Полезные файлы   Пользователи   Поиск

 

 FB Wiki   Уроки   Скачать FreeBASIC   Проекты   Ссылки   Загрузить   Каталог ссылок

 
 

 Замечания и предложения по работе сайта оставляйте здесь.

Сейчас на сайте:

Вы вошли как: Guest   Регистрация   

Логин:     Пароль:     

Создай бесплатно WebMoney кошелёк на своём мобильном всего за 5 минут

 

Делаем dll своими руками

Хэндл окна

Графические средства языка

Точка пересечения отрезков

Окна без рамки

Физика поведения ядра

Win32 API Введение

►Урок 1 Win32 API

►Урок 2 Win32 API

►Урок 3 Win32 API

►Урок 4 Win32 API

►Урок 5 Win32 API

►Урок 6 Win32 API

►Урок 7 Win32 API

►Урок 8 Win32 API

►Урок 9 Win32 API

►Урок 10 Win32 API

►Урок 11 Win32 API

►Урок 12 Win32 API

►Урок 13 Win32 API

►Урок 14 Win32 API

►Урок 15 Win32 API

►Урок 16 Win32 API

►Урок 17 Win32 API

►Урок 18 Win32 API

►Урок 19 Win32 API

►Урок 20 Win32 API

►Урок 21 Win32 API

►Урок 22 Win32 API

►Урок 23 Win32 API

►Урок 24 Win32 API

Ассоциация файлов

Определить OS

Выводит имя компьютера

 

 

 

Win32 API. Урок 16. Объект события.

Опытом поделился и оптимизировал под FreeBASIC:   15.01.2011

 

 

Реклама:

Кредит подбор кредита Сбербанк онлайн

 

Мы изучим, что такое объект события и как использовать его в мультитредной программе.

Теория:

В предыдущем туториале я продемонстрировал, как треды взаимодействуют друг с другом через собственные windows-сообщения. Я пропустил два других метода:
глобальная переменная и объект события. В этом туториале мы используем оба.

Объект события - это что-то вроде переключателя: у него есть только два состояния: вкл и выкл. Вы создаете объект события и помещаете его в коде соответствующего треда, где наблюдаете за состоянием объекта. Если объект события выключен, ждущие его треды "спят". В подобном состоянии треды мало загружают CPU.

Вы можете создать объект события, вызвав функцию CreateEvent, которая имеет следующий синтаксис:

function CreateEvent _
(byval lpEventAttributes as LPSECURITY_ATTRIBUTES, _
byval bManualReset as BOOL, _
byval bInitialState as BOOL, _
byval lpName as LPCSTR) as HANDLE

• lpEventAttributes --> Если вы укажете значение NULL, у создаваемого объекта будут установки безопасности по умолчанию.
• bManualReset --> Если вы хотите, чтобы Windows автоматически переключал объект события в "выключено", вы должны присвоить этому параметру значение FALSE. Иначе вам надо будет выключить объект вручную с помощью вызова ResetEvent.
• bInitialState --> Если вы хотите, чтобы объект события при создании был установлен в положение "включено", укажите TRUE в качестве данного параметра, в противном случае объект события будет установлен в положение "выключен".
lpName --> Указатель на ASCIIZ-строку, которая будет именем объекта события. Это имя будет использоваться, когда вы захотите вызвать OpenEvent.

Если вызов прошел успешно, CreateEvent возвратит хэндл на созданный объект события. В противном случае она возвратит NULL.

Вы можете изменять состояние объекта события с помощью двух API-функций: SetEvent и ResetEvent. Функция SetEvent устанавливает объект события в положение "включено". ResetEvent делает обратное.

Когда объект события создан, вы должны поместить вызов функции WaitForSingleObject в тред, который должен следить за состоянием объекта события. Эта функция
имеет следующий синтаксис:

function WaitForSingleObject _
(byval hObject as HANDLE, _
byval dwTimeout as DWORD) as DWORD

• hObject --> Хэндл одного из синхронизационных объектов. Объект события - это вид синхронизационного события.
• dwTimeout --> Указывает в миллисекундах время, которое эта функция будет ждать, пока объект события не перейдет во включенное состояние. Если указанное время пройдет, а объект события все еще выключен, WaitForSingleObject вернет управление. Если вы хотите, чтобы функция наблюдала за объектом бесконечно, вы должны указать значение INFINITE в качестве этого параметра.

Пример:

Нижеприведенный пример отображает окно, ожидающее пока пользователь не выберет какую-нибудь команду из меню. Если пользователь выберет "run thread", тред
начнет подсчет. Когда он закончит, появится сообщение, информирующее пользователя о том, что работа выполнена. Во время того, как проводится подсчет, пользователь
может выбрать команду "stop thread", чтобы остановить тред.

файл objevent.bas

Скопировать данный код в буфер обмена

файл objevent.bi

Скопировать данный код в буфер обмена

файл objevent.rc

Скопировать данный код в буфер обмена

Анализ:

В этом примере я демонстрирую другую технику работы с тредами.

case WM_CREATE
hEventStart = CreateEvent _
(NULL, _
FALSE, _
FALSE, _
NULL)
hThread = CreateThread _
(NULL, _
NULL, _
cPtr(LPTHREAD_START_ROUTINE,@ThreadProc), _
NULL, _
0, _
@ThreadID)
CloseHandle _
(hThread)

Вы можете видеть, что я создал объект события и тред во время обработки сообщения WM_CREATE. Я создаю объект события, установленного в состояние "выключено" и обладающего свойством автоматического выключения. После того, как объект события создан, я создаю тред. Тем не менее, тред не начинает выполняться немедленно, так как он ждет, пока не включится объект события:

sub ThreadProc(byval param as uInteger)
dim in as integer
dim de as integer
do
de=600000000
WaitForSingleObject _ '
(hEventStart, _
INFINITE)

WaitForSingleObject. ждет, пока не включится объект события, а затем возвращается. Это означает, что даже если тред создан, мы помещаем его в спящее состояние. Когда пользователь выбирает в меню команду "run thread", мы включаем объект события:

case IDM_START_THREAD
SetEvent _
(hEventStart)

Вызов SetEvent включает объект события, после чего WaitForSingleObject возвращается и тред начинает выполняться. Когда пользователь выбирает команду "stop thread", мы устанавливаем значение глобальной переменной в TRUE.

if EventStop <> TRUE then
in +=1
de -=1
in -=3
else
MessageBox(hwnd,@StopString,@AppName,MB_OK)
EventStop = FALSE
continue do
end if

Это останавливает тред и снова передает управление функции WaitForSingleObject. Заметьте, что мы не должны вручную выключать объект, так как мы указали при вызове функции CreateEvent, что значение bManualReset равно FALSE.

[C] Iczelion, пер. Aquila.

 

 

Прокомментировать

Ваше имя:  

Ваш e-mail:  

Сообщение:



Введите код: 

 

 

   Спасибо можно сказать, посетив любую ссылку:

 

 

© 2010-2012

DEPOzit (Попов Денис Владимирович)

WebMoney кошелёк: WMID#302963000004

ICQ:279786014 или R549103331586   Z116647355686