Я новичок в области потоков! Хочу синхронизировать два потока на изменение Caption у формы. Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var s : TS; s1: TS1; begin s:= TS.Create(True); s.FreeOnTerminate:=True; s.Priority:= tpLowest; s1 := s1.create(True); s1.FreeOnTerminate := true; s1.Priority:= tpLowest; s.Resume; s1.Resume; end; end. Code: unit Unit2; interface uses Classes; type TS = class(TThread) private { Private declarations } protected procedure Execute; override; end; TS1 = class(TThread) private { Private declarations } protected procedure Execute; override; end; implementation USES Unit1; procedure UpdateCaption; begin Form1.Caption := 'Caption'; end; { TS } procedure TS.Execute; begin Synchronize(UpdateCaption); end; procedure TS1.Execute; begin Synchronize(UpdateCaption); end; end. Выдает ошибку. [Error] Unit2.pas(37): There is no overloaded version of 'Synchronize' that can be called with these arguments [Error] Unit2.pas(42): There is no overloaded version of 'Synchronize' that can be called with these arguments Искал в гугле, без результатов(Все одинаковые статьи с фрагментами кода) В чем моя проблема?
PHP: type TS = class(TThread) private { Private declarations } ????? protected procedure Execute; override; end; TS1 = class(TThread) private { Private declarations } ????? protected procedure Execute; override; end; А описывать процедуру кто будет? В private добавь
procedure UpdateCaption; begin Form1.Caption := 'Caption'; end; Должна быть оформлена для каждого потока отдельно.Т.е. объявляешь их в интерфейсе: Code: TS = class(TThread) private { Private declarations } procedure UpdateCaption; protected procedure Execute; override; end; TS1 = class(TThread) private { Private declarations } procedure UpdateCaption; protected procedure Execute; override; end; и юзаешь в коде Code: procedure TS.UpdateCaption; begin Form1.Caption := 'Caption'; end; procedure TS1.UpdateCaption; begin Form1.Caption := 'Caption'; end; P.S. опередили((
Как процедуру в private добавить и описать. Если можно киньте готовый код, а то не как не могу разобратся.
Artist, дык тебе NemeZz код уже кинул PHP: TS = class(TThread) private procedure UpdateCaption; protected ....... PHP: procedure TS.UpdateCaption; begin ......... end;
Зачем для этого два класса создавать? Просто два экземпляра одного класса надо Тут ясно написано что ты вызываешь Synchronize c неправильными параметрами Смотрим что написано в хэлпе: где AMethod это параметр имеющий тип метода класса: Ты же, передаешь в него глобальную процедуру: Которая к классу не имеет никакого отношения Тебе товарищи fenixelite и NemeZz показали как решить. Но я считаю это решение временное, тупо вставить и все. Мозгов от этого не прибавится. Завтра у тебя появится другой вопрос из похожей области, тебе опять дадут временное решение. Так будет продолжаться долго, пока ты не поймешь что ты пополнил ряды говнокодеров Потому резюмирую: Ты не только в области потоков новичок, но и вообще в программировании. В потоки лучше не лезь, пока не прочитаешь пару нормальных книжек, и не научишься отличать методы объектов от глобальных подпрограмм.
GhostOnline, Браво професcор. Полностью с тобой согласен. P.S Хотел спросить, ты сам программирование выучил до этого уровня, или в Вузе учишься?
Какого уровня? Я в дельфи мягко сказать середнячок. А вообще сам. По книгам. Но не скрою что в этом году таки поступаю в вуз. Без диплома труднее устроиться.