|
Вопрос # 2 182/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Я все с той же темой про компонент на палитре TThreadList. Пытаюсь написать вот так. В чем проблема и как решить. Что за ошибки выдает понимаю, непонимаю почему.
 |
Вопрос задал: Nasgool (статус: 2-ой класс)
Вопрос отправлен: 10 декабря 2008, 14:05
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Цитата:
Что за ошибки выдает понимаю, непонимаю почему.
Перевожу на русский язык:
{ TNsThread }
procedure TNsThread.Execute;
begin
while True
do
begin
if Assigned(NsOnExecute) // <---- У класса TNsThread нет поля NsOnExecute
then
NsOnExecute(Self, Index); // <---- У класса TNsThread нет поля NsOnExecute
if Terminated
then
Exit;
end;
end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 10 декабря 2008, 18:17
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 10 декабря 2008, 20:05; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 10 декабря 2008, 14:12 [#1]:
Ну сколько раз писать - смешивание потоков и VCL кода ничем хорошим не обернётся.
Хотя с другой стороны, если посмотреть, то у класса TNsThread нет свойства NsOnExecute - оно вот и ругается.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Вадим К (статус: Академик), 10 декабря 2008, 18:33 [#2]:
to min@y™
Не находите, что Ваш "ответ" есть просто почти копия моего сообщения выше?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 10 декабря 2008, 18:43 [#3]:
Цитата:
Не находите, что Ваш "ответ" есть просто почти копия моего сообщения выше?
А я и не видел сообщения, т.к. отвечаю всегда из формы, которая мне приходит по почте. Увидел, только когда ответил. Что теперь делать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 10 декабря 2008, 18:48 [#4]:
Застрелиться наверно
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Nasgool (статус: 2-ой класс), 10 декабря 2008, 19:23 [#5]:
Спасибо за то, что ткнули носом!
Переделал. Откомпилил без ошибок. Буду тестировать. Вот что получилось:
unit UNsThreadList;
interface
uses
Classes;
type
TNsEvent = procedure (Index: Integer) of object;
TNsThread = class(TThread)
private
{ Private declarations }
public
Index: Integer;
NsPExesute: Pointer;
procedure Execute; override;
end;
TNsThreadList = class(TComponent)
protected
{ Protected declarations }
NsList: TList;
NsThread: TNsThread;
NsOnExecute: TNsEvent;
NsOnCreate,
NsOnDestroy: TNotifyEvent;
public
{ Public declarations }
Count: Integer;
published
{ Published declarations }
function Add: Integer;
procedure Resume(Index: Integer);
procedure Suspend(Index: Integer);
procedure Terminate(Index: Integer);
property OnCreate: TNotifyEvent read NsOnCreate write NsOnCreate;
property OnExecute: TNsEvent read NsOnExecute write NsOnExecute;
property OnDestroy: TNotifyEvent read NsOnDestroy write NsOnDestroy;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Nsgool Soft', [TNsThreadList]);
end;
{ TNsThreadList }
function TNsThreadList.Add: Integer;
begin
Result := NsList.Add(GetMemory(SizeOf(NsThread)));
TNsThread(NsList.Items[Result]^) := TNsThread.Create(True);
TNsThread(NsList.Items[Result]^).FreeOnTerminate := True;
TNsThread(NsList.Items[Result]^).Index := Result;
end;
constructor TNsThreadList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
NsList := TList.Create;
NsThread := TNsThread.Create(True);
NsThread.FreeOnTerminate := True;
if Assigned(NsOnExecute)
then
NsThread.NsPExesute := @NsOnExecute;
if Assigned(NsOnCreate)
then
NsOnCreate(Self);
end;
destructor TNsThreadList.Destroy;
var
I: Integer;
begin
if Count > 0
then
for I := 0 to Count - 1
do
begin
TNsThread(NsList.Items[I]^).Terminate;
if TNsThread(NsList.Items[I]^).Suspended
then
TNsThread(NsList.Items[I]^).Resume;
TNsThread(NsList.Items[I]^).WaitFor;
end;
NsThread.Free;
NsList.Free;
if Assigned(NsOnDestroy)
then
NsOnDestroy(Self);
inherited Destroy;
end;
procedure TNsThreadList.Resume(Index: Integer);
begin
if TNsThread(NsList.Items[Index]^).Suspended
then
TNsThread(NsList.Items[Index]^).Resume;
end;
procedure TNsThreadList.Suspend(Index: Integer);
begin
if not TNsThread(NsList.Items[Index]^).Suspended
then
TNsThread(NsList.Items[Index]^).Suspend;
end;
procedure TNsThreadList.Terminate(Index: Integer);
var
I: Integer;
begin
TNsThread(NsList.Items[Index]^).Terminate;
TNsThread(NsList.Items[Index]^).WaitFor;
NsList.Delete(Index);
if Count > 0
then
for I := 0 to Count - 1
do
TNsThread(NsList.Items[Index]^).Index := I;
end;
{ TNsThread }
procedure TNsThread.Execute;
begin
while True
do
begin
TNsEvent(NsPExesute^)(Index);
if Terminated
then
Exit;
end;
end;
end.
|
|
min@y™ (статус: Доктор наук), 10 декабря 2008, 20:05 [#6]:
Я бы тебе посоветовал стереть всё нафиг и написать по-нормальному. Ну, вот, что за изврат:
Result := NsList.Add(GetMemory(SizeOf(NsThread)));
TNsThread(NsList.Items[Result]^) := TNsThread.Create(True);
TNsThread(NsList.Items[Result]^).FreeOnTerminate := True;
TNsThread(NsList.Items[Result]^).Index := Result;
Ну нафига тут ещё указатели на указатели? Давай я тебе на простом примере объясню, как проще.
Написал я тебе пример, отправил в личку. Изучай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|