Member
Статус: Не в сети Регистрация: 15.03.2005 Откуда: Красноярск
Вопрос несколько ламерский но все же:
нужно организовать перемещение мышкой по форме графического объекта ака большая точка.
Как бы это замутить?
Извеняюсь за беспокойство (хотя по-моему этот вопрос так никого и не обеспокоил), сам нашел решение .
Я пытался действовать через paintbox, а проще и быстрее оказалось через Timage. Просто ставим обработку onmouseup и к свойствам image'а top и height добавляем x и y из процедуры обработки (аргументы). Все, картинка движется по экрану, правда без "следа".
procedure DoEnd ;
published
property onReady : TNotifyEvent Read FOnReady Write FOnReady ;
end ;
procedure TMyThread.Execute ;
begin
MyWSocket.DnsLookup(DNS) ;
Synchronize(DoEnd) ;
end ;
procedure TMyThread.DoEnd ;
begin
if Assigned(FOnReady) then FOnReady(Self) ;
end ;
При создании потока вешаешь обработчик на onReady, и заводишь где-то переменную,
например, типа Boolean. Эта переменная будет устанавливаться в обработчике в True, если обработчик сработал.
Переменную, после запуска потока, периодически проверяешь.
Если она стала True, то поток завершился нормально и что-то вернул (это тебе нужен не TNotifyEvent, а свой тип сделать).
Если нет, и прошло уже контрольное время, то делаешь потоку Terminate.
Вот, в общих чертах, так.
_________________ Linux - must die.
Долгих лет тебе, Билли !
procedure DoEnd ; published property onReady : TNotifyEvent Read FOnReady Write FOnReady ; end ;
procedure TMyThread.Execute ; begin MyWSocket.DnsLookup(DNS) ; Synchronize(DoEnd) ; end ;
procedure TMyThread.DoEnd ; begin if Assigned(FOnReady) then FOnReady(Self) ; end ;
При создании потока вешаешь обработчик на onReady, и заводишь где-то переменную, например, типа Boolean. Эта переменная будет устанавливаться в обработчике в True, если обработчик сработал. Переменную, после запуска потока, периодически проверяешь. Если она стала True, то поток завершился нормально и что-то вернул (это тебе нужен не TNotifyEvent, а свой тип сделать). Если нет, и прошло уже контрольное время, то делаешь потоку Terminate.
Вот, в общих чертах, так.
Проверку на завершение можно сделать гораздо проще - у TThread есть OnTerminate. Делаеш так( я сам так щас в проге делаю):
Код:
Thread:=TSchedulerThread.Create(False); Thread.OnTerminate:=ThreadDone; ... procedure ThreadDone(Sender: TObject); begin ShowMessage('Поток окончен'); // Здесь, естественно вставляеш нужный тебе код end; // Конец нашего потока ...
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Столкнулся тут с непоняткой одной, есть некая функция, она обернута в try...except, так вот она постоянно в except вываливается, но если try...except убрать, то все работает нормально и никаких ошибок не вылазит.
Такое ощущение, что трай включает более жесткий контроль типов и(или) еще чего-нибудь. В чем тут может быть дело?
ЗЫ функция большая, но проверена много раз и должна работать нормально.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 17.09.2003 Откуда: UA г.Донецк
Проблема с потоками. TThread.
Вобщем дело в чем функция вызывается в цикле n раз (на данный момент n=142)/ Функция довольно длинная и в заыисимости от входных данных может работать от 2 сек до 40 сек. Сама она находится во внешней dll, и подключается к The Bat.
Решил запхнуть в несколько потоков.
Так, вот если делаю один екземпляр класса TMyThread(мой, дочерний, от TThread) то все работает нормально, но долго, если делаю несколько экземпляров, то скорость увеличивается в разы но, по оканчании работы она выдает результат(тот что надо) и the bat благополучно завершает работу. Хотя должен остатся висеть в трае. Причем неважно развернут bat или нет. Его процесс завершается.
Отсюда вопрос. от чего ээто может быть. и как лучше сделать многопоочность?
_________________ Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Lord_of_Darkness может быть выше по стеку, есть другой try/except. Чудес действительно небывает.
Цитата:
как лучше сделать многопоочность?
Без TThread.
Цитата:
если делаю несколько экземпляров, то скорость увеличивается в разы но, по оканчании работы она выдает результат(тот что надо) и the bat благополучно завершает работу. Хотя должен остатся висеть в трае. Причем неважно развернут bat или нет. Его процесс завершается. Отсюда вопрос. от чего ээто может быть.
Хм, телепатов увезли, без кода тяжело разобраться в вопросе. Вполне возможно что-то не так с разрушением потока, допустим деструктор класса TThread выполняется в контексте главного потока Bat'a. В деструкторе вызывается GetCurrentThread, и вместо нужного хендла мы получаем хендл бата, и далее все понятно. Это очень приблизительно, но в этом может быть причина. Сделай как - один поток, но повысь его приоритет.
Member
Статус: Не в сети Регистрация: 17.09.2003 Откуда: UA г.Донецк
Daemon Повышение приоритета не поможет Все зависит от ответа из вне.
код вот он привожу не весь ина че меня забанят за стока текста.
Код:
//Описание класа потока type TMyThread_First =class (TThread)
protected
procedure Execute; override; procedure run; function HostToIP(DNS, Ip):boolean; public ind:integer; DNS:string; Ip: string; stat:boolean;
end;
procedure TMyThread_First.Execute; begin run; end;
procedure TMyThread_First.run; begin Ip:=''; stat:=HostToIP(DNS, Ip); Terminate; end; ...................................................... //сама основная функция function CheckDNSBL(Header:string;Pas:string;LetterTem:String=''):integer; var ... Thread,Thread2:TMyThread_First;
begin ... if pos('http://',DNSBL[i])<>0 then DNSBL[i]:=copy(DNSBL[i],8,length(DNSBL[i])-7); Thread:=TMyThread_First.Create(true); Thread.DNS:=Reversip+DNSBL[i]; Thread.Resume; Thread.ind:=i; inc(i); if pos('http://',DNSBL[i])<>0 then DNSBL[i]:=copy(DNSBL[i],8,length(DNSBL[i])-7); Thread2:=TMyThread_First.Create(true);
while not (Thread.Terminated or Thread2.Terminated) do begin application.ProcessMessages; end;
if Thread.Terminated then begin AnsBL:=Thread.Ip; j:= Thread.ind; if pos('http://',DNSBL[i])<>0 then DNSBL[i]:=copy(DNSBL[i],8,length(DNSBL[i])-7); Thread:=TMyThread_First.Create(true); Thread.DNS:=Reversip+DNSBL[i]; Thread.Resume; Thread.ind:=i; inc(i); end else if Thread2.Terminated then begin AnsBL:=Thread2.Ip; j:= Thread2.ind; if pos('http://',DNSBL[i])<>0 then DNSBL[i]:=copy(DNSBL[i],8,length(DNSBL[i])-7); Thread2:=TMyThread_First.Create(true); Thread2.DNS:=Reversip+DNSBL[i]; Thread2.Resume; Thread2.ind:=i; inc(i); end; if pos('127.0.0.',AnsBL)<>0 then begin inc(entrys); TrueDNS.Add('http://'+DNSBL[j]); end; AnsBL:=''; end; ... end;
_________________ Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы
Junior
Статус: Не в сети Регистрация: 19.09.2005 Откуда: Подольск
Сделай вот так:
procedure TMyThread_First.Execute;
begin
Ip:='';
stat:=HostToIP(DNS, Ip);
end;
И все.
procedure TMyThread_First.run;
begin
Ip:='';
stat:=HostToIP(DNS, Ip);
Terminate; <-А ВОТ ЭТО - НЕ НАДО !!!!! Когда завершается Execute, он сам терминируется !
end;
_________________ Linux - must die.
Долгих лет тебе, Билли !
Member
Статус: Не в сети Регистрация: 17.09.2003 Откуда: UA г.Донецк
defecator Результат печальный.
Цитата:
procedure TMyThread_First.Execute; begin Ip:=''; stat:=HostToIP(DNS, Ip); end;
Поток висит до бесконечности. Хотя процедура отрабатывает.... Добавлено спустя 5 минут, 4 секунды Решил несколько другим методом. Слежу не за завершением потока а за завершением мойе процедуры в потоке . Мда.... Добавлено спустя 1 час, 19 минут, 42 секунды выяснил причину
_DiseL_ писал(а):
Так, вот если делаю один екземпляр класса TMyThread(мой, дочерний, от TThread) то все работает нормально, но долго, если делаю несколько экземпляров, то скорость увеличивается в разы но, по оканчании работы она выдает результат(тот что надо) и the bat благополучно завершает работу. Хотя должен остатся висеть в трае. Причем неважно развернут bat или нет. Его процесс завершается.
Сделал отдельно форму с кнопками которая пользует эту dll. И вот.
Причина в том что dll грузится как динамическая и ошибка вылетает при
FreeLibrary(DLLInstance); Причем ошибка из разряда обращение в не свою область памяти. Может проще сделать статическую линковку и неморочить голову???
Наверное я всеже тупой....
_________________ Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
_DiseL_
Цитата:
FreeLibrary(DLLInstance); Причем ошибка из разряда обращение в не свою область памяти.
Причины две - либа не открыта, или же ты каким-то образом затираешь память. Процедура потока выполняется всего один раз ищи причины в своем коде, ненужен там Terminate.
W[E]RTEX посмотрел, она на С++, а не на С Главная причина, почему переписать не получится - там присутствует либа. Выход есть - написать длл, которая экспортирует нужные ф-ции из этой либы, сделать вполне реально, дерзай.
Member
Статус: Не в сети Регистрация: 17.09.2003 Откуда: UA г.Донецк
Daemon
Цитата:
Причины две - либа не открыта, или же ты каким-то образом затираешь память. Процедура потока выполняется всего один раз ищи причины в своем коде, ненужен там Terminate.
Причина в типе string . Нельзя его использовать Теперь перевожу все в PChar. Есть ли аналог
function Copy(S; Index, Count: Integer): string;
и
delete(S:string;index,Count:integer);
для Pchar Добавлено спустя 21 минуту, 29 секунд И еще вопрос. В Рекомендациях при создании dll говорится что лучше использовать pChar вместо string. Это относится и к TStringList ?? Если да то есть ли какой нибудь аналог этого??
_________________ Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Цитата:
function StrCopy(Dest, Source: PChar): PChar; Копирует Source в Dest и возвращает указатель на Dest.
Цитата:
И еще вопрос. В Рекомендациях при создании dll говорится что лучше использовать pChar вместо string. Это относится и к TStringList ?? Если да то есть ли какой нибудь аналог этого??
PChar - это для того, чтобы обеспечить совместимость с С, плюс чтобы не включать дельфийский менеджер памяти. TStringList лучше не использовать. Добавлено спустя 54 секунды
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения