Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 63 из 116<  1 ... 60  61  62  63  64  65  66 ... 116  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 15.03.2005
Откуда: Красноярск
Вопрос несколько ламерский но все же:
нужно организовать перемещение мышкой по форме графического объекта ака большая точка.
Как бы это замутить?
Извеняюсь за беспокойство (хотя по-моему этот вопрос так никого и не обеспокоил), сам нашел решение :dance: .
Я пытался действовать через paintbox, а проще и быстрее оказалось через Timage. Просто ставим обработку onmouseup и к свойствам image'а top и height добавляем x и y из процедуры обработки (аргументы). Все, картинка движется по экрану, правда без "следа".



Партнер
 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
defecator
Хм. Я правильно понял создаем клас TMyThread
Код:
type TMyThread =class (TTread)
   
     protected
     MyWSocket: TWSocket;
      procedure Execute; overrided;
     public
      DNS:string;
end;

TMyThread.Execute;
begin
 MyWSocket.DnsLookup(DNS);
end;
 

затем запускаем поток и ждем его завершения , и после снимаем результат? Или я что то упустил??

P.S Извини за кучу вопросов, в подобное мало залазил :oops:

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Junior
Статус: Не в сети
Регистрация: 19.09.2005
Откуда: Подольск
Да, примерно так.

Но у тебя еще должен быть некоторое событие, по которому извне станет ясно, как завершился поток.

TMyThread = class(TThread)
private
FOnReady : TNotifyEvent ;

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.
Долгих лет тебе, Билли !


 

Member
Статус: Не в сети
Регистрация: 02.03.2005
Откуда: Владивосток
defecator писал(а):
Да, примерно так.

Но у тебя еще должен быть некоторое событие, по которому извне станет ясно, как завершился поток.

TMyThread = class(TThread)
private
FOnReady : TNotifyEvent ;

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;
// Конец нашего потока ...
и все


 

Junior
Статус: Не в сети
Регистрация: 19.09.2005
Откуда: Подольск
Возможно, что и проще.

Я почему-то привык к тому методу, что описал :-)

P.S. Если нужно будет сделать Terminate зависшему потоку, то сработает
onTerminate, и получится, что поток завершился нормально :-)

_________________
Linux - must die.
Долгих лет тебе, Билли !


 

Member
Статус: Не в сети
Регистрация: 02.03.2005
Откуда: Владивосток
defecator писал(а):
Возможно, что и проще.

Я почему-то привык к тому методу, что описал :-)

P.S. Если нужно будет сделать Terminate зависшему потоку, то сработает
onTerminate, и получится, что поток завершился нормально :-)


Ну так ты же сам будеш вызывать Terminate для потока, а вообщето пусть каждый останется при своем, я так думаю


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Столкнулся тут с непоняткой одной, есть некая функция, она обернута в try...except, так вот она постоянно в except вываливается, но если try...except убрать, то все работает нормально и никаких ошибок не вылазит.
Такое ощущение, что трай включает более жесткий контроль типов и(или) еще чего-нибудь. В чем тут может быть дело?
ЗЫ функция большая, но проверена много раз и должна работать нормально.

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


 

Junior
Статус: Не в сети
Регистрация: 19.09.2005
Откуда: Подольск
Чудес не бывает. Значит, исключение перехватывается где-то выше.

Ты бы функцию привел, что ли ?
Или ты предлагаешь погадать над неизвестным ?

_________________
Linux - must die.
Долгих лет тебе, Билли !


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
функция большая, приводить смысла нет. Исключение выше перехватываться не может, т.к. в трай завернута только эта функция.

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (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, и вместо нужного хендла мы получаем хендл бата, и далее все понятно. Это очень приблизительно, но в этом может быть причина. Сделай как - один поток, но повысь его приоритет.

_________________
Ку ку


 

Junior
Статус: Не в сети
Регистрация: 19.09.2005
Откуда: Подольск
2Lord_of_Darkness

Ты отладчиком походи по ней - чего уж проще :-)

_________________
Linux - must die.
Долгих лет тебе, Билли !


 

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);

   Thread2.DNS:=Reversip+DNSBL[i];
   Thread2.Resume;
   Thread2.ind:=i;
   inc(i);

while  i<DNSBL.Count do
   begin
   
    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;

Поток висит до бесконечности. :weep: :bandhead:
Хотя процедура отрабатывает....
Добавлено спустя 5 минут, 4 секунды
Решил несколько другим методом. Слежу не за завершением потока а за завершением мойе процедуры в потоке . Мда....
Добавлено спустя 1 час, 19 минут, 42 секунды
выяснил причину
_DiseL_ писал(а):
Так, вот если делаю один екземпляр класса TMyThread(мой, дочерний, от TThread) то все работает нормально, но долго, если делаю несколько экземпляров, то скорость увеличивается в разы но, по оканчании работы она выдает результат(тот что надо) и the bat благополучно завершает работу. Хотя должен остатся висеть в трае. Причем неважно развернут bat или нет. Его процесс завершается.
Сделал отдельно форму с кнопками которая пользует эту dll. И вот.
Причина в том что dll грузится как динамическая и ошибка вылетает при
FreeLibrary(DLLInstance); :bandhead: Причем ошибка из разряда обращение в не свою область памяти. :insane:
Может проще сделать статическую линковку и неморочить голову???
Наверное я всеже тупой.... :weep:

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Member
Статус: Не в сети
Регистрация: 04.04.2005
Откуда: Екатеринбург
Есть SDK http://cp.people.overclockers.ru/cgi-bin/dl.pl?id=14255&filename=LCDSDK_1.02.218.rar.
Но оно для С. А можно ли его переделать под Delphi ? Ели да, то подскажите как.


 

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 секунды
Цитата:
Если да то есть ли какой нибудь аналог этого??
array of PChar; Фактически char **ar;

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
Daemon
Цитата:
TStringList лучше не использовать.

Плохо:(

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 63 из 116<  1 ... 60  61  62  63  64  65  66 ... 116  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan