Консультация № 176520
05.02.2010, 23:01
0.00 руб.
06.02.2010, 07:07
0 7 1
Добрый вечер Уважаемые эксперты.
У меня возникла проблема при организации потоков.
Необходимо организовать два независимых потока Thread1, Thread2, которые будут выводить результаты увеличения числа на 1 в отдельные Edit.
Здесь можно описать два класса, но поскольку два
потока идентичны, можно ограничиться созданием двух экземпляров одного
класса TSimpleThread. И для регулировки приоритетов использовать два компонента TrackBar.
Проект должен
показывать изменение скорости работы в зависимости от установленного
приоритета.

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

Обсуждение

Неизвестный
05.02.2010, 23:15
общий
это ответ
Здравствуйте, Уважаемьй Dimon4ik.
Сначала, что ето thread11 и thread22?
Если посмотриш, то после создания вторий нити, и thread11 и thread22 true - в ресулат: каждая нит делает два едит-а :)
Просто положи в клас твоей нити один tEdit и когда сделаеш первую нит пиши Нит1.Едит=Едит1; а для второго: Нит2.Едит:=Едит2.
Тогде тебе внутри каждой нити придетса толко с один едит имет заботу.
Извини моего русского язьика, пожалуйста :)
5
Отличный пример! Спасибо.<br>Все вышло. Разницу видно. Благодаря Вам понял суть, как работать с потоками. :)<br>
Неизвестный
05.02.2010, 23:29
общий
Вот, ето работает. Уменя Q9400, 4 ядра и, думаю, потому, что он всегда idle, поетому нет разница в твои нити:

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;

type // Объявление класса потока-потомка
TSimpleThread = class(TThread)
Edit: TEdit;
procedure Execute; override;
procedure oper;
public
procedure OutMessage;
end;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
Thread1: TSimpleThread; // Экземпляр класса «поток»
Thread2: TSimpleThread; // Экземпляр класса «поток»
public
{ Public declarations }
end;

var
Form1: TForm1;



implementation

procedure TSimpleThread.Execute;
begin
// Содержание потока
while not Terminated do
begin
Synchronize(OutMessage);
Synchronize(oper);
sleep(1);
end;
end;

procedure tsimplethread.oper;
begin
Edit.Tag:=Edit.Tag+1;
end;

procedure TSimpleThread.OutMessage;
begin
Edit.Text:=IntToStr(Edit.Tag); // Обращение к VCL
end;

{$R *.dfm}


procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Thread1.Suspend;
if Trackbar1.position=0 then thread1.Priority:=tpidle;
if Trackbar1.position=1 then thread1.Priority:=tplowest;
if Trackbar1.position=2 then thread1.Priority:=tplower;
if Trackbar1.position=3 then thread1.Priority:=tpNormal;
if Trackbar1.position=4 then thread1.Priority:=tphigher;
if Trackbar1.position=5 then thread1.Priority:=tphighest;
if Trackbar1.position=6 then thread1.Priority:=tpTimeCritical;
Thread1.Resume;
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
Thread2.Suspend;
if Trackbar2.position=0 then thread2.Priority:=tpidle;
if Trackbar2.position=1 then thread2.Priority:=tplowest;
if Trackbar2.position=2 then thread2.Priority:=tplower;
if Trackbar2.position=3 then thread2.Priority:=tpNormal;
if Trackbar2.position=4 then thread2.Priority:=tphigher;
if Trackbar2.position=5 then thread2.Priority:=tphighest;
if Trackbar2.position=6 then thread2.Priority:=tpTimeCritical;
Thread2.Resume;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Thread1:= TSimpleThread.Create(true); // Экземпляр класса «поток»
Thread1.Edit := Edit1;
Thread1.Resume;
Thread2:= TSimpleThread.Create(true); // Экземпляр класса «поток»
Thread2.Edit := Edit2;
Thread2.Resume;
end;

end.
давно
Мастер-Эксперт
425
4118
06.02.2010, 07:18
общий
Dimon4ik:
Если у Вас программа не занимается (параллельно) какими-то черезвычайно сложными вычислениями, то разницу между временем выполнения двух потоков Вы можете и не заметить.
Условно говоря время выполнения изначально разделяется между тремя потоками (главная форма, Thread1 и Thread2) равномерно. Если Вы делаете приоритет какого-то потока большим, то заметить разницу во времени выполнения можно тогда, когда этот поток с большим приоритетом будет выполнять какую-то сложную задачу, например жмёт видео.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
06.02.2010, 14:28
общий
sir Henry:
Видимо у меня компьютер слабый - разница видна
давно
Мастер-Эксперт
425
4118
06.02.2010, 15:41
общий
Dimon4ik:
Я просто не знаю, чем занимаются Ваши потоки.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
08.02.2010, 10:12
общий
Bochvarov NikB:
Странно почему то Ваш пример у меня не заработал - запускаю в Delphi7. Программа компилируется, запускается, но в Edit ничего не меняется. Хотя по коду всё должно работать. Что не так? Можете выложить полный исходник? Хотел бы посмотреть, код красивый и простой :).
Неизвестный
08.02.2010, 13:27
общий
Вот исходник проекта (тоже Д7) Исходник, tThread's, tEdit's
Форма ответа