![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки
den49 © (2009-11-01 23:14:00)Здравствуйте. Помогите, пожалуйста, найти ошибку. Задача стоит так:два потока читают 2 файла, 3-ий поток их сравнивает построчно.Стринглисты заполняются верно, потоки тоже срабатывают, а строки почему-то не сравниваются :(
type
Struct = record
component:TMemo;
filename:string;
index:integer;
eventIsfull:Cardinal;
end;
Str_event = record
event1:Cardinal;
event2:Cardinal;
memo:TMemo;
end;
Pstruct=^Struct;
Pstr_event=^Str_event;
var
Form1: TForm1;
GetFile,GetFile2,CompareFile:THandle;
ThreadID1,ThreadID2,ThreadID3:Cardinal;
SL: array[0..2] of TStringList;
CL:array[0..1] of TstringList;
{$R *.dfm}
procedure SetText(N:Pstruct); stdcall;
begin
SL[N.index]:=TStringList.Create;
SL[N.index].LoadFromFile(N.filename);
N.component.Lines.Assign(SL[N.index]);
SetEvent(N.eventIsfull);
end;
procedure TextCompare(N:Pstr_event);stdcall;
var
i: integer;
begin
WaitForSingleObject(N.event1, INFINITE);
WaitForSingleObject(N.event2, INFINITE);
CL[0]:=TStringList.Create;
CL[1]:=TStringList.Create;
for i:=0 to SL[0].Count-1 do
begin
if (SL[0].Strings[i] = SL[1].Strings[i]) then
CL[0].Add(SL[0].Strings[i])
else
CL[1].Add(SL[0].Strings[i]);
end;
N.memo.Lines.Assign(CL[0]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var struct1,struct2:^struct;
struct3:^Str_event;
begin
new(struct1);
new(struct2);
new(struct3);
struct1^.eventIsfull := CreateEvent(nil,false,false, 'ListIsfullEvent');
struct2^.eventIsfull := CreateEvent(nil,false,false, 'ListIsfullEvent');
Opendialog1.Execute;
struct1^.filename:=OpenDialog1.FileName;
struct1^.component:=Memo1;
struct1^.index:= 0;
Opendialog2.Execute;
struct2^.filename:=OpenDialog2.FileName;
struct2^.component:=Memo2;
struct2^.index:= 1;
struct3^.event1:=struct1^.eventIsfull;
struct3^.event2:=struct2^.eventIsfull;
GetFile := CreateThread(NIL, 0, @SetText, struct1, 0, ThreadID1);
GetFile2 := CreateThread(NIL, 0, @SetText, struct2, 0, ThreadID2);
CompareFile := CreateThread(NIL, 0, @TextCompare, struct3, 0, ThreadID3);
end;
brother (2009-11-02 10:25:00) [1]> бо имя одно.
это сразу засмущало ;)
итог: в топку)
Сергей М. (2009-11-02 09:54:00) [2]
> бо имя одно
А, ну да .. не обратил внимания ..
Полная лажа в общем)
Leonid Troyanovsky (2009-11-02 09:52:00) [3]
> Сергей М. © (02.11.09 09:46) [6]
> У него 3-й поток ждет по очереди завершения
1 и 2 - один и тот же event, бо имя одно.
--
Regards, LVT.
Сергей М. (2009-11-02 09:46:00) [4]
> Leonid Troyanovsky © (02.11.09 09:27) [5]
У него 3-й поток ждет по очереди завершения 1-го (1-й WFSO), потом 2-го (2-й WFSO)
Leonid Troyanovsky (2009-11-02 09:27:00) [5]
> brother © (02.11.09 05:03) [1]
> на вскидку: синхронизация потоков где?
А нету.
Особенно трогателен повторный WFSO, типа,
не верь глазам своим.
--
Regards, LVT.
Сергей М. (2009-11-02 08:35:00) [6]Абсолютно бестолковый код, не говоря уже о грубых ошибках.
Сергей М. (2009-11-02 08:26:00) [7]Убирай CreateThread.
BeginThread() !!
brother (2009-11-02 05:59:00) [8]упс поспешил...
brother (2009-11-02 05:03:00) [9]на вскидку: синхронизация потоков где?