Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки


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]

на вскидку: синхронизация потоков где?


Наверх

Титульная страница Поиск, карта сайта Написать письмо