
07.12.2009, 17:27
|
Прохожий
|
|
Регистрация: 24.05.2008
Сообщения: 4
Репутация: 10
|
|
Работа с потоками (Thread)
Доброе время суток. У меня такая проблема. Написали программу в которой два потока которые выполняют одну операцию. В данных потока установлен по умолчанию приоритет "tpLowest". При изменении приоритета при помощи "TrackBar", приоритет меняется на больший, но не меняется на меньший. Как исправить, помогите пожалуйста.
Код:
unit Thrdunit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Thrd, ComCtrls, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Timer1: TTimer;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Label3: TLabel;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
private
{ Private declarations }
public
Thread1,Thread2:TSiriipieThread;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Thread1:=TSiriipieThread.Create(true);
Thread1.Priority:=tpLowest;
Thread1.Resume;
Thread2:=TSiriipieThread.Create(true);
Thread2.Priority:=tpLowest;
Thread2.Resume;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text:=IntToStr (Thread1.Count );
Edit2.Text:=IntToStr (Thread2.Count );
//Thread1.
Thread1.Count:=0;
Thread2.Count:=0;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
Var
I:Integer;
Priority:TThreadPriority;
begin
Priority:=tpLowest;
For I:=0 To (Sender as tTrackBar).Position + 1
Do inc(Priority) ;
If Sender=TrackBar2
Then Thread1.Priority:=Priority
Else Thread2.Priority:=Priority;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
Var
I:Integer;
Priority:TThreadPriority;
begin
Priority:=tpLowest;
For I:=0 To (Sender as tTrackBar).Position + 1
Do inc(Priority) ;
If Sender=TrackBar1
Then Thread1.Priority:=Priority
Else Thread2.Priority:=Priority;
end;
end.
сам поток
Код:
unit Thrd;
interface
uses
Classes;
type
TSiriipieThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
Count:Integer;
//Thread1, Thread2: TSimpleThread;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TSiriipieThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TSiriipieThread }
procedure TSiriipieThread.Execute;
var
I, Total, Avg:integer;
begin
While True
Do
Begin
Total:=0;
For I:=1 To 10 Do
Avg:=Avg Div 10;
Inc(Count);
End;
end;
end.
|