Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2019, 10:00   #1
manchester_alan
Форумчанин
 
Регистрация: 07.01.2015
Сообщений: 231
По умолчанию Приоритеты потоков

Управление потоками
Цель работы: исследовать значение приоритета потоков для их синхронизации в системе с псевдопараллельным режимом работы.
Задание1.
Разработайте программу сортировки чисел. Программа должна удовлетворять следующим требованиям:-Должны быть реализованы процедуры сортировки пузырьком, вставкой, и быстрой сортировки.-Размер выборки для сортировки должен задаваться пользователем.-Должен быть реализован режим отрисовки процесса сортировки.-Пользователь должен иметь возможность замедлять и останавливать сортировку.-Все три сортировки должны работать одновременно и над одинаковым набором входных данных. -Каждая сортировка должна отрисовываться в отдельном окне.Для отрисовки сортировки можно использовать вызов SetPixel: перед обменом местами двух элементов сначала стираем соответствующие точки, закрашивая их цветом фона, а после обмена –рисуем заново. Вызов SetPixelтакже играет роль небольшой задержки во времени.Поскольку размер выборки будет меняться, целесообразно использовать динамические массивы. Для этого используйте операторы newи delete.Для задания начальных значений используйте генератор случайных чисел rand(): он возвращает значение от 0 до MAX_RAND. Как создать новое окно? Окно проще всего создать на основе шаблона –ресурса окна. Для добавления нового шаблона выберите вкладку Resources, выберите раздел Dialog, кликните на нем правой кнопкой мыша и выберите Newdialog. Добавится новый шаблон диалога с идентификатором IDD_DIALOGxxx, где ххх –некоторое число.Теперь в основной программе надо объявить переменную типа Cdialog, и вызвать метод Createдля его инициализации, а затем –метод Showдля отображения на экране:CDialog MyDialog;MyDialog.Create(идентифика тор ресурса диалога);MyDialog.ShowWindow(SW_SHO W);Чтобы окно не исчезло сразу после выхода из функции, переменную MyDialogнадо сделать глобальной, а метод Createвызывать в функции OnInitDialogглавного окна.Для изменения размера окна и положения на экране используйте метод MoveWindow.Для визуализации сортировки можно воспользоваться функцией SetPixel. Для этого перед изменением любой ячейки массива соответствующую точку необходимо стереть, закрасив цветом фона, а затем, после внесения изменений, нарисовать заново. Для получения цвета фона можно воспользоваться функцией GetPixel.

Примерный вид интерфейса показан на рисунке.

Задание 2.
Установите приоритет каждого потока. Приоритет потока устанавливается при помощи функции SetThreadPriority:SetThreadPriority (дескриптор_потока, величина_приоритета);Дескриптор потока –величина типа HANDLE,возвращаемая при вызове CreateThread.Величина приоритета может принимать значения 0, +-1, +-2, +-15.Попробуйте определить самостоятельно, что происходит при установке того или иного приоритета. Попробуйте также определить значения приоритета, вызывающие синхронное окончание работы сортировок.
manchester_alan вне форума Ответить с цитированием
Старый 22.03.2019, 10:39   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И? Какую цель вы преследовали копи-пастя сюдя свое ДЗ?
p51x на форуме Ответить с цитированием
Старый 22.03.2019, 10:50   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,537
По умолчанию

Дык он во фриланс хотел, ошибся разделом.
Пора, пора на форуме заводить раздел "Халява, сэр!"
digitalis вне форума Ответить с цитированием
Старый 20.11.2019, 07:14   #4
Maetsky
Пользователь
 
Регистрация: 14.03.2011
Сообщений: 14
По умолчанию

Решил не создавать новую тему, а написать сюда.

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

Код1:
Код:
TPotok1=class (TThRead)
protected
procedure Execute();override;
end;

TPotok2=class (TThRead)
protected
procedure Execute();override;
end;

var
Potok1: TPotok1;
Potok2: TPotok2;

procedure TPotok1.Execute();
begin
  While not Terminated do Form1.Timer1.Enabled:=true;
end;

procedure TPotok2.Execute();
begin
  While not Terminated do Form1.Timer2.Enabled:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Potok1:=TPotok1.Create(false);
  Potok1.Priority:=tpHighest;
  Potok2:=TPotok2.Create(false);
  Potok2.Priority:=tpHighest;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Potok1.Terminate;
  Potok2.Terminate;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //действие таймера 1
  Timer1.Enabled:=false;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  //действие таймера 2
  Timer2.Enabled:=false;
end;
Как вариант, можно для приложения задать высокий приоритет процесса:

Код2:
Код:
SetPriorityClass(GetCurrentProcess,HIGH_PRIORITY_CLASS);
Прочёл в литературе, что потоки получают приоритеты на базе классов приоритета своих процессов. Означает ли это, что если задать высокий приоритет процесса, то все таймеры будут работать с высоким приоритетом и в таком случае не надо заморачиваться с приоритетами потоков? Другими словами, Код2 оставить, а Код1 можно убрать?
Maetsky вне форума Ответить с цитированием
Старый 20.11.2019, 09:07   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Maetsky Посмотреть сообщение
SetPriorityClass(GetCurrentProcess, HIGH_PRIORITY_CLASS);

Прочёл в литературе, что потоки получают приоритеты на базе классов приоритета своих процессов. Означает ли это, что если задать высокий
Это устаревшая информация. А новой нету. Так что пробуйте.

Цитата:
Сообщение от Maetsky Посмотреть сообщение
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//действие таймера 1
Timer1.Enabled:=false;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
//действие таймера 2
Timer2.Enabled:=false;
end;
У вас таймеры на форме они оба выполняются в основном потоке. Это значит, что второй таймер не будет выполняться пока первый не завершит работу.

Цитата:
Сообщение от Maetsky Посмотреть сообщение
Имеется несколько таймеров, каждый из которых выполняет большое количество действий и с малым интервалом, иногда такое приложение подвисает.
На форме рекомендуется оставлять 1 таймер. А вот в потоках по одному на поток можно.
Я бы их на основе CreateWaitableTimer сделал, типо такого

Код:
procedure Wait(lNumberOfSeconds : Longint);
const
 _SECOND = 10000000;
var
 lBusy : LongInt;
 hTimer : LongInt;
 liDueTime : LARGE_INTEGER;

begin
  hTimer := CreateWaitableTimer(nil, True, 'WaitableTimer');
  if hTimer = 0 then
   Exit;
  liDueTime.QuadPart := -10000000 * lNumberOfSeconds;
  SetWaitableTimer(hTimer, TLargeInteger(liDueTime), 0, nil, nil, False);

  repeat
    lBusy := MsgWaitForMultipleObjects(1, hTimer, False,
            INFINITE, QS_ALLINPUT);
   Until lBusy = WAIT_OBJECT_0;

    // Close the handles when you are done with them.
   CloseHandle(hTimer);

End;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 20.11.2019, 09:15   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

предложенный вариант(от TC) НЕ спасет от зависания.
Цитата:
Код:
  While not Terminated do Form1.Timer1.Enabled:=true;
поскольку поток по сути ничего не делает.
а то что блокирует
Цитата:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //действие таймера 1
так и осталось блокировать.
никакая реакция формы НЕВОЗМОЖНА ровно до тех пор пока не выполниться дейстие(-я).
Цитата:
каждый из которых выполняет большое количество действий
по сути вам надо вынести действия "по таймеру" в поток(-и)
Код:
while not terminated do begin
// действия которые были в OnTimer1(2)
end;
а теперь получается и таймер по сути лишнее звено.
повтор действий и так уже есть(while...). и даже чаще чем нужно.
хотя быть может и реже, но по крайней мере так часто как возможно.

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

А если мы хотим чтобы потоки в таком разе не мешали реакциям формы, они(потоки) должны будут иметь МЕНЬШИЙ приоритет.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.11.2019 в 09:19.
evg_m вне форума Ответить с цитированием
Старый 21.11.2019, 01:48   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Maetsky Посмотреть сообщение
Можно для каждого таймера создать поток
Поток для таймера!?
Это какое-то кощунство, имхо.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приоритеты _Milana_ Общие вопросы по Java, Java SE, Kotlin 2 12.01.2012 17:06
Приоритеты _Milana_ Помощь студентам 2 12.01.2012 14:37
Приоритеты потоков Soundkilla Помощь студентам 1 24.04.2011 19:37
приоритеты в GPSS severin Помощь студентам 0 18.12.2009 12:57
Приоритеты. Geg[C/c++] Помощь студентам 1 12.03.2009 19:18