![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите с разобраться с потоками [D7]
Zahar © (2005-01-09 15:31:00)Помогите плиз разобраться с потоками. Нашел кучу информации где разные потоки выполняют разные функции, а мне нужно чтобы все потоки выполняли одну и ту же операцию.
Задача дла примера:
Есть текстовый файл в котором N-строк с числами (для примера возьмем 300).
Каждый поток должен прочитать из этого файла по M-записей (например 50), проделать над ними определенные преобразования и записать в другой текстовый файл.
Таким образом, как я понимаю, динамически должно быть создано 6 потоков (300/50=6) каждый из которых возьмет свою часть записей из исходного файла:
Thread 1 - 1..50
Thread 2 - 51..100
Thread 3 - 101..150
Thread 4 - 151..200
Thread 5 - 201..250
Thread 6 - 251..300
Для примера каждое число нужно умножить на 2 и записать в конечный файл.
Т.е. функция для потока будет одна, но обрабатывать в каждом потоке она будет разные последовательности данных.
Помогие очень разобраться с этой задачей. В потоках я полный новичек.
Заранее благодарен за любую помощь.
Zahar (2005-01-09 16:33:00) [41]При компиляции:
[Warning] Unit2.pas(29): Comparing signed and unsigned types - widened both operands
При нажатии на кнопочки ничего не происходит :(
olookin (2005-01-09 16:21:00) [42]Ну вот по моему это работает:
Это главный юнит:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Unit2, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
t: array [0..5] of TMyThread;
th: array [0..5] of integer;
run: boolean;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
run:=false;
for i:=0 to 5 do begin
t[i]:=TMyThread.Create(true);
t[i].Priority:=tpNormal;
th[i]:=t[i].ThreadID;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
randomize; run:=true;
for i:=0 to 5 do t[i].Resume;
end;
end.
А это юнит с потоками:
unit Unit2;
interface
uses
Classes, sysutils, stdctrls;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure UpdateLabel;
end;
implementation
uses Unit1;
{ TMyThread }
var lind: integer;
procedure TMyThread.Execute;
var i,j,k: integer;
begin
while run do
for i:=0 to 5 do
if ThreadID=th[i] then begin
for j:=0 to Form1.ComponentCount-1 do
if Form1.Components[j].Name='Label'+inttostr(i+1) then begin
lind:=j;
Synchronize(UpdateLabel);
end;
end;
end;
procedure TMyThread.UpdateLabel;
begin
(Form1.Components[lind] as TLabel).Caption:=IntToStr(random(1000));
end;
end.
sniknik (2005-01-09 16:17:00) [43]> Очень хотелось бы увидеть кусочек кода который создает эти потоки. Может напишите?
давно написано
x:\Program Files\Borland\Delphi7\Demos\Threads
olookin (2005-01-09 16:07:00) [44]Честно сказать, я в потоках тоже новичок. Попробую...
Zahar (2005-01-09 15:54:00) [45]2 olookin
Очень хотелось бы увидеть кусочек кода который создает эти потоки. Может напишите?
olookin (2005-01-09 15:50:00) [46]Почему бы создании потоков не запоминать их ThreadID, а при выполнении функции указывать каждому потоку в зависимости от его ThreadID, какой участок файла ему прочитывать?
Zahar (2005-01-09 15:33:00) [47]Желательно использовать встроенный класс TThread.