| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Threads |
| Автор: Barovskiy 15.1.2006, 02:43 |
| Всем привет!!!!!!!!!!!! У меня такой вопрос - как можно загнать в отдельный поток определенное действие?? например: мне нужно загнать цикл try begin Yield; application.ProcessMessages; ........... except ............. finally ............... end; в потоки как это сделать и как определить количество потоков???? программа просто очень виснет и очень медлено выполняет действия ((((((((((( а с потоками я не рабтал кто может мне объяснить популярно как загнать все это в поток????? Заранее благодарю!!!!!!!!! |
| Автор: Poseidon 15.1.2006, 03:45 | ||
Вот самый простой пример. Причем без использования класса TTread.
|
| Автор: Barovskiy 15.1.2006, 03:57 |
| 2 Poseidon , спасибо, за ответ!!!!!!!! а как определить кол-во потоков???? к пример усделать 100 потоков чтоб за один раз 100 циклов прошло????? |
| Автор: Poseidon 15.1.2006, 04:10 | ||
Экстремал
но вариант не идеален. И более того, я бы для твоей задачи все же воспользовался бы TThread. Там хоть синхролизировать можно потоки. Хотя и этот вариант может прокатить |
| Автор: FRAGNATIC 15.1.2006, 04:26 |
| http://forum.vingrad.ru/index.php?showtopic=60076 |
| Автор: Barovskiy 15.1.2006, 13:18 |
| 2 Poseydon 2 FRAGNATIC http://forum.vingrad.ru/index.php?showtopic=60076 Отличный материал!!!!! Спасибо!!!!!!!!!! |
| Автор: Albinos_x 15.1.2006, 13:41 | ||
при выполнении в отдельном потоке на этой строчке могут возникать ошибки.... |
| Автор: Barovskiy 15.1.2006, 14:02 |
| 2 Albinos_x А как лучше сделать чтоб прога не тормазила???? |
| Автор: Barovskiy 15.1.2006, 15:41 | ||||||
у меня не компилируется ((((((
внутри цикла я обращаюсь к компонентам например
как мне можно работать с компонентами внутри процедуры??? в цикле идет счет выполненых операций....
вобщем ругается на все компоненты (((((((( как это лечить ?????? |
| Автор: Albinos_x 15.1.2006, 16:53 | ||||
ты должен указать "чей компанент":
но здесь тоже могут возникать глюки... здесь лучше делать:
|
| Автор: Barovskiy 15.1.2006, 17:41 | ||||
я сделал так
скопилилось почти нормально за исключением [Warning] Unit1.pas(126): Variable 'Label6' might not have been initialized прога запускается нормально, но как только нажимаю на кнопку для пуска потока - Вылетает ошибка что какой то кусок памяти не может быть рид .... как мне инициализировать - указать чей компонент ???? |
| Автор: Albinos_x 15.1.2006, 18:20 |
| А как ты создаёшь этот: var RxLabel6: TRxLabel; ? |
| Автор: Barovskiy 15.1.2006, 19:00 | ||||
RxLabel6: TRxLabel; - RX компонент, проще говоря так
а как надо указать чей компонент??????? |
| Автор: FRAGNATIC 15.1.2006, 19:15 | ||
nil те надо var Label6: TLabel; ... begin label6:=TLabel.Create(nil); |
| Автор: Barovskiy 15.1.2006, 19:15 | ||
Я сдела так
компилируется но не работает ((((((((((((((((((((((( тоычнее начинает работать ... а потом вылетает ошибка (((( |
| Автор: FRAGNATIC 15.1.2006, 19:20 |
| мой пост предыдущий читай=) |
| Автор: Barovskiy 15.1.2006, 19:39 | ||||||
ты имеешь ввиду все что я вписал в раздел var необходимо создать и в разделе begin?
что типа того? |
| Автор: FRAGNATIC 15.1.2006, 19:52 | ||
если ты не кидал на форму не опендиалога не мемо а тока обхявил в вар то их надо СОЗДАТь перед тем как к ним оброщатся=) если ты кинул их на форму то их и объявлять в вар не надо=) Добавлено @ 19:53 а в finally надо освободить память типа label6.Free |
| Автор: Barovskiy 15.1.2006, 20:09 | ||||||||
у меня все на форме лежит и опендиалог и мемо .... делаю так - компилирует, но когда нажимаю на кнопку запуска потока, то он вообще не реагирует, как будто у меня в кнопке ничего не прописано ((((( сама процедура выглядит типа так
а код вызов процедуры так
никакой реакции у меня даже кнопока остается активной, хотя в процедуре прописано Button1.enabled:=false; ((((( Добавлено @ 20:15
Память в конце обязательно освобождаю, с самого начала )))) |
| Автор: FRAGNATIC 15.1.2006, 20:16 | ||
зачем тогда их в вар объявять? они и так уже объявлены и создаются в том случаии если создана форма =) |
| Автор: Barovskiy 15.1.2006, 21:10 | ||
всеравно не работает ((((( уже пробовал все компилируется а работать не хочет ..... есть ли какойнибудь пример на эту тему, рабочий пример ???... или всетаки попробовать через TThreads сделать? |
| Автор: Albinos_x 15.1.2006, 22:07 | ||
мы тут не телепаты... код покажи... |
| Автор: FRAGNATIC 15.1.2006, 22:15 | ||||
какого начала? финали это уже конец =) не нравится так освобожда в другом месте тока ОДНО НО любые переменые объявленые в ВАР любой из функций, процедуры являются локальными и уничтожаются в конце выполнения этой процедуры тоесть
после твоего end; Memo1 и так уже существовать не будет=) так что если хош с ними работать и дальше где-то то надо их сделать глобальными перемеными а не локальными чисто для данной процедуры Добавлено @ 22:17 гы в том коде что я ща процетировал у тя ваще переменых нету выще они были в этойже ф-е) |
| Автор: Barovskiy 15.1.2006, 23:26 | ||||||||||||||
Я имел ввиду ссамого начала создания самого проекта , гы .... ))))))))
Щас попробую обяснить что я хочу сделать и че получается:-)))) У меня была фрома, на ней компонены, мемо , опендиалог, лейблы ... логмемо, кнопки старт стоп в общем все компоненты которые нужны я выбираю в опен диалог текстовый файл в котором у меня ip адреса и мне надо получить их имена, у нас в сетке больше 120 компов, и мне нада составить список какой ip кому принадлежит .... при нажатии на кнопку у меня запускается цикл ... и пока не конец файла он проверяет все ip, т.е. читает строку в файле пингует его возвращает ответ в log так вся эта бадяга виснет ... и очень долго идет проверка, поэтому я хочу вогнать этот кусок проверки в поток ..... вот кусок того что было
потом как мне отпостили выше я переделал в такой вариант
ну самf кнопка, которая вызывает поток
так в этом варианте все компилится и даже запускается сама программа, нажимаю на пуск - ноль эмоций.... хотя после создания все компонентов идет
кнопка так и остается доступной.... а если вырубить прогу... то такое начинается... Добавлено @ 23:33
Я их убрал из вара |
| Автор: Albinos_x 15.1.2006, 23:42 | ||||||||
это скорее всего из-за:
компаненты уже существуют, поэтому генерируется ошибка, код завершается без обработки:
т.к. блок try идёт после...
выкинь нафиг эту строку наконец... в потоке будет генерироваться ошибка... |
| Автор: Barovskiy 16.1.2006, 00:26 | ||||
эту фигню я уже выкинул .... просто код скопировал со старой версии .. . а в потоке ее нету уже..... Добавлено @ 00:36
я убрал все.............. и при нажатии на кпопку вылетает ошибка после чего прога закрывается..... |
| Автор: Albinos_x 16.1.2006, 00:43 | ||||
вот тебе простенький пример(который у меня работает):
запуск:
т.к. это пример поэтому расписывать написанные и используемые мной функции не стал |
| Автор: Barovskiy 16.1.2006, 00:46 | ||||||
вот так везде поставил
указал пренадлежность каждого компонента.... убрал из вара и все вот это
вывалшивает ошибку ((((((( не хочет запускать поток ((((((((( |
| Автор: Albinos_x 16.1.2006, 00:47 | ||
что говорит пошаговая отладка? на какой строчке ошибка? |
| Автор: Barovskiy 16.1.2006, 01:09 | ||
Отладка виснет как только нажимаю на кнопку старт ... дельфи умирает просто ..... (((((( ВОт ошибки The exception unknown software exception (0x0eedfade) occured at location 0x77e738b2 System Error. Code 1400 Invalid window handle наверное я сегодня забыл руки с зада вытащить и поставить их в плечи.... |
| Автор: Albinos_x 16.1.2006, 01:25 | ||||
ищи где даёшь неправильный хандле...
а через F7? |
| Автор: Barovskiy 16.1.2006, 01:32 |
| Access violation at address 00493E11 in module 'IptoName.exe'. Read of address 00000000 вот еще |
| Автор: Albinos_x 16.1.2006, 01:36 | ||||
ну мне это толком ничего не говорит... я не видел кода... и не знаю на каких строчках вылетает ошибка... |
| Автор: Barovskiy 16.1.2006, 01:37 | ||||
даже и не знаю где это может быть (((((((((((( все правильно вродебы..... Добавлено @ 01:46 Сделал так на кнопке
выволилось вот это Connection close gracesfull F7 тоже не получается |
| Автор: Albinos_x 16.1.2006, 02:02 | ||
а как тебе писали не пробовал?
Добавлено @ 02:12 http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=d6c46cd5506de4f28cd1bf7a30c2f37a&search_in=posts&result_type=topics&flag=search&debug=&highlite=threads |
| Автор: Barovskiy 16.1.2006, 02:15 | ||
пробовал ... вываливались те ошибки, а потом увеличил потоки ..... скорей всего я чето не так написал, компилится но вызывает ошибки при запуске .... |
| Автор: Albinos_x 16.1.2006, 02:15 | ||||
что не получается? на какой строчке? Добавлено @ 02:17
смотри событие OnFormCreate() |
| Автор: Barovskiy 16.1.2006, 02:28 | ||||
Спасибо!!! буду смотреть ! кажись разобрался.... точнее не разобрался пока еще, я переписал все заного и у меня заработало!!!!! в чем я допустил ошибку пока не знаю ... но факт что работает!!!! прога не виснет все делает нормально!!!!!!!!! НО после того как все сделано и я закрываю прогу опять выпригивает ошибка The exception unknown software exception (0x0eedfade) occured at location 0x77e738b2 System Error. Code 1400 Invalid window handle По крайней мере уже легче!!!!!!!!!!!!!! Добавлено @ 02:34
у меня там ничего нету пусто ошибка вылетает если я хоть раз нажал на кнопку а если открыть и закрыть то ничего не выскакивает .... это в потоке чтото происходит..... отладчик вообще не хочет работать.... виснет ужасно ... |
| Автор: Демо 16.1.2006, 04:54 |
| Хм... как всё запущено. Документацию и статьи, видимо, не полностью прочитаны или невнимательно. Пока будешь использовать VCL в доп. потоке без синхронизации, так и будут у тебя ошибки при выполнении. Ни один из приведенных примеров нормально также не избавлен от этих ошибок. Кроме того, нужно использовать не CreateThread, а BeginThread, либо самому добавлять строку IsMultiThread := TRUE; |
| Автор: Guest 16.1.2006, 12:54 | ||||||
Читал я полностью, возможно не внимательно... я все заного перепроверю...
Каким образом мне сделать синхронизацию VCL ????
Поставил CreateThreads - таже ошибка вылетает просле закрытия прогрммы... Где необходимо вписать IsMultiThread := TRUE; ???? |
| Автор: Демо 16.1.2006, 12:59 |
| Guest Сформулируй, пожалуйста, требования к программе по порядку. Не надо с конкретным кодом. ПРосто словами - что она должна делать, как отображать данные. В таком длинном топике уже все разнесено по всему треду, и не найдешь, что же конкретно нужно сделать. |
| Автор: Alexeis 16.1.2006, 13:07 |
| Для синхронизации с VCL надежно работает метод Synchronize Класса Thread - это самый простой способ если синхронизация происходит достаточно редко. |
| Автор: Barovskiy 16.1.2006, 13:08 | ||||
| Демо Предыдущий пост был моим, не вошел под пользователем.... (((((((
Дело вот в чем - открываю программу, в опендиалог выбираю текстовый файл в котором прописаны IP адреса моей локалки, загружаю в прогу, и пока не конец файла прога читает строчку в файле, пингует IP адрес, возвращает ответ с именем компа записывает в текствоый файл, плюс весь лог подключений(всех действий) записывается в log.txt Работало все нормально, только жутко все висло, сделал поток и всё событие кнопки старт перенес в поток, а в кнопке страт указал создание потока. Работает, но после того как прога закрывается то вылетает ошибка. Отладчик не пашет вообще, виснет по страшному, кода я нажимаю старт (((( и не возможно посмотреть на какой строчке И еще вопрос - как сделать не один поток а несколько??? к примеру 10 чтоб за один раз создавало 10 отдельных потоков? for i:=0 to 10 do ... не работает ... вылетает тоже ошибка. Добавлено @ 13:10
а пример можно ??? как это правильней сделать??? |
| Автор: Alexeis 16.1.2006, 13:12 | ||
Вероятно неверно завершается поток |
| Автор: Barovskiy 16.1.2006, 13:25 | ||
Хех, верно.... но как его завершить???? |
| Автор: _hunter 16.1.2006, 13:39 |
| никак. поставь FreeOnTerminate в true и он сам остановится Добавлено @ 13:39 точнее умрет |
| Автор: Alexeis 16.1.2006, 13:41 |
| я не очень понял какой вариант использования потоков используется. Если Делфийский то вызов Terminate затем ожидание завершения Waitfor затем освобождение памяти. |
| Автор: Barovskiy 16.1.2006, 13:57 | ||||||
сделал так
все равно вылетает
У меня дельфийский медот Можно какойнить пример??? я не совсем понимаю куда писать |
| Автор: Guedda 16.1.2006, 14:10 | ||||
| Поставь FreeOnTerminate в начале кода. Т.е.:
И еще, когда создаешь поток (может это уже было написано, но я повторю), нужно делать вот так:
|
| Автор: _hunter 16.1.2006, 14:11 | ||
а это:
зачем? FreeOnTerminate это свойствр класса TThread... |
| Автор: Alexeis 16.1.2006, 14:12 | ||
Добавлено @ 14:15 Кроме того в потоке нужно перодически проверять свойстро terminated если оно true то закончить работу потоковой процедуры.(выйти) |
| Автор: Barovskiy 16.1.2006, 15:19 | ||||
Выкладываю код ... у меня едит крыша, я совсем запутался.... (((((((((
а вот сама кнопка
все работает, но вылетает ошибка когда закрываю прогу.... вот исходник, что я там не так сделал???? у меня уже голова кругом идет ((((( |
| Автор: Демо 16.1.2006, 15:22 | ||||
Можешь использовать как шаблон для реализации своего потока вот этот код:
Пример использования:
Заодно можешь вот этот топик почитать: http://forum.sources.ru/index.php?showtopic=120033 |
| Автор: Alexeis 16.1.2006, 15:29 | ||||||
так делать нельзя класс TThread абстрактный нужно делать наследдника и прекрыть execute вот пример:
код ChekIp поместить в Execute а вот это
создает целых два потока различными методами |
| Автор: Albinos_x 16.1.2006, 15:35 | ||
я не знаю как ты там пинингуешь, но не думал о том что на один порт хочешь послать инфу с 10 потоков?... И читать из одного файла 10 потоками... 9 из них сразу же обрушатся (это конечно симотря как читаешь)... |
| Автор: Barovskiy 16.1.2006, 15:47 | ||||||
Спасибо, буду разбираться
у меня в примере нету этого .... все равно вылетает ... Как вот мне мой код оптимизировать чтоб нормально было ... и потоков много было .... мне мой код ктонибуль может показать что исправить по конкретнее.... Добавлено @ 15:51
так и есть .... читаю одну строку ... а остальные просто рушаться... и опять ошибка... может менять порты при создании трейда???? |
| Автор: Демо 16.1.2006, 16:17 |
| Barovskiy Выложи код, который используешь для пингования конкретного хоста, попробую помочь... |
| Автор: Barovskiy 16.1.2006, 16:30 | ||||||
Демо
Вот функиции
а вот что в цикле
|
| Автор: Albinos_x 16.1.2006, 16:30 |
| тогда без Class(TThread) и синхронизации не обойтись |
| Автор: Barovskiy 16.1.2006, 17:24 |
| Пожалуйста, кто по умнее меня приведите прример по моему примеру.... плиззззззззз....... совсем уже башню сносит как сделать поток нормальным способом а не через ... как у меня ... и чтоб можно было задавать определенное количество потоков ..... хотябы внутри программы ... от и до если можно .... самые главные определяющие места ..... Пожалуйста... В аналогичных примерах я поглядел, но так и не понял как все этоприменить к моему примеру |
| Автор: Демо 16.1.2006, 17:24 |
| Barovskiy Т.е., судя по коду, ты хочешь просто получить имя компьютера из DNS, неважно, включен он или нет? |
| Автор: Barovskiy 16.1.2006, 17:35 | ||
что-то типа того, но включен он илинет этоне важно, ответ просто пустой.... |
| Автор: Alexeis 16.1.2006, 17:40 | ||
|
| Автор: Barovskiy 16.1.2006, 17:49 | ||
| alexeis1 Танкс за пример!!!! Я сейчас заного попробую.... свои действия мне вставлять сюда ???
а как настчет VCL компонентов??? итли мне сделать принадлежность каждого компонента???? |
| Автор: Albinos_x 16.1.2006, 17:58 | ||
| да...
через синхронизацию работать с ними... |
| Автор: Barovskiy 16.1.2006, 18:09 |
| Albinos_x Поставил... не работает .... запускается, начинается проверка и все.... В лог записано Allready connect буду пробовать .... может получится.... (((( |
| Автор: Albinos_x 16.1.2006, 18:16 | ||
у тебя практически все действия с компанентами... так что надо вызывать твои процедуры через метод Synchronize(...); |
| Автор: Alexeis 16.1.2006, 18:22 | ||
| Действия лучше вставлять чуть ниже после первого end; а вот синхронизация
|
| Автор: Демо 16.1.2006, 21:00 | ||||
| Могу для твоей задачи предложить вот такое решение. Количество потоков не учитывается, но думаю, что сам доделаешь. Модуль с потоком
Пример использования
|
| Автор: Barovskiy 17.1.2006, 01:20 | ||
| alexeis1 На твоем примере вродебы как получилось - НО он прверяет один и тот же адрес два раза, примеру если у меня в локалке 100 адрессов, то он пишет что их 200 а потом один и тотоже проверяет два раза... а не каждый поток следующий адрес.... Добавлено @ 01:24 и после вырубления проги все равно вылетает ошибка..... Может вовсе не надо делать эти потоки.. у мен якрыша уже едит ... может хотябы сделать так чтоб прога ошибку не выплевывала..... Добавлено @ 01:31 Демо
Большое спасибо за пример!!!!! а можно ли чтонибудь попробовать именно через мой пример??? Просто твой не много не подходит ... я бы хотел его потом еще приминить в другие примеры чтоб просто поменять внутренности цикла и прога готова для другово :-) что скажешь ??? можешь помочь накидать пример , просто с пустым циклом выполнения... тогда поток будет универсален практически для всего ..... и для использования VCL и для внутреннего создание компонентов.... мне кажется это вариант хороший.... иметь заготовку куда просто можно впихнуть действия |
| Автор: Barovskiy 17.1.2006, 01:44 |
| не для конкретной проверки IP адресов, а вообще, для всего где может понадобиться потоки ... даже не знаю что можно придумать, - все что угодно, Что скажите, мастера???? |
| Автор: Alexeis 17.1.2006, 10:12 |
| Barovskiy приведи текст ошибки Добавлено @ 10:13 Может ошибка не в потоке |
| Автор: Guedda 17.1.2006, 10:22 |
| Может ты в потоке вызываешь MessageDlg or ShowMessage? Опиши подробнее ошибку. |
| Автор: Albinos_x 17.1.2006, 10:27 |
| OnClose или OnDestroy обрабатываешь? у меня такое же ощущение... возможно неправильно где-то ещё выделяет память или освобождает... |
| Автор: Guedda 17.1.2006, 10:31 |
| В общем, выложи код, которым вызываешь, и код самого потока. |
| Автор: Barovskiy 17.1.2006, 12:50 | ||
| Здесь у меня ничего не обрабатывается
тоже ничего нету Может быть вылетает шибка из-за того что я делаю запись всего лога в текстовый файл????? Хотя не должно быть ... А вот сама ошибка ![]() Главное выпригивает послето того как пройдет весь цикл если просто открыть и закрыть прогу то ничего не выпригивает Сейчас выложу все |
| Автор: Alexeis 17.1.2006, 12:54 |
| Почему бы не попробовать найти ошибку трасировкой F7, F8 Добавлено @ 12:58 или накидать брекпоинтов |
| Автор: Barovskiy 17.1.2006, 13:32 | ||||||
код потока
Вот сам вызов потока
и все.... работает в отдельном потоке, прога не виснет все нормально, но после того как закончилась работа и закрываю саму прогу то вылетает ошибка.... воть ... Добавлено @ 13:34
Я уже пробовал .... меня дельфи зависает намертво как только я запускаю поток и через 20 минут мне приходится уже через диспечера валить и дельфи и прилажение ... |
| Автор: Guedda 17.1.2006, 13:41 |
| У тебя какие-то проблемы с хендлом какого-то окна. Скорее всего, при работе программы, она теряет свой собственный хэндл. Вопрос: Зачем тебе нужны потоки? Ответь, пожалуйста, по существу. |
| Автор: Romikgy 17.1.2006, 13:43 |
| А если эту ф-цию запустить без потока, тож ошибка? ЗЫ Мож быть целая пачка ошибок, если из потока без дополнительных движений, обращатся к форме! |
| Автор: Barovskiy 17.1.2006, 14:10 | ||||
Поток нужен чтоб прога не висла, и я хотел чтоб одну работу прога выполняла несколькими потоками. Я так понял мне несколько потоков не получится сделать, или надо весь код заного переделывать... Ходябы избавиться от этой ошибки хендла ....
Если весь код поместить на кнопку то никаких ошибок не вылетает, но все виснет, хотя и работает. как только перевожу весь код в отдельную процедуру и кнопкой создаю поток то тоже все арботает и прога не виснет, но после закрытия проги вылетает эта ошибка впринцепи она мне не портит работу, но хочется чтоб было все четко и разобраться почему она вылетает ... |
| Автор: Демо 17.1.2006, 14:21 |
| Тебе же сказали, что если будешь обращаться к VCL из потока, от ошибок не избавишься. |
| Автор: Romikgy 17.1.2006, 14:33 |
| Сделай через Tthread, раздели часть где берутся данные с формы и ставятся, и на часть где идет обработка данных, где идет обращение к форме, засунь в синхронизм, только болько не пользуйся , потому как тогда смысл от отдельного потока никакой |
| Автор: Guedda 17.1.2006, 14:34 | ||
Да. Вот нашел в книжке.
|
| Автор: Romikgy 17.1.2006, 14:35 |
| И еще почитай http://forum.vingrad.ru/index.php?showtopic=60076 это очень помогает! Добавлено @ 14:36 Можно , но для этого надо делать дополнительные телодвижения |
| Автор: Alexeis 17.1.2006, 14:50 |
| Barovskiy с F7 и у меня были проблемы но при использовании брекпоинтов (ставлю кучу) и F4 для перескока между ними удавалось отладить без зависания ( т.е. первую точку прошел - снимаем, вторую и т.д.) |
| Автор: Barovskiy 17.1.2006, 14:59 | ||
А синхронизация у меня не получается :-( |
| Автор: Guedda 17.1.2006, 15:15 | ||
Это всего лишь цитата из учебника. Я лишь цитирую. Но и придерживаюсь этого мнения. Если треды не сильно нужны, то лучше ProcessMessages использовать. |
| Автор: Alexeis 17.1.2006, 15:16 | ||
а по подробней |
| Автор: Romikgy 17.1.2006, 15:30 | ||
Дело каждого свое |
| Автор: Демо 17.1.2006, 15:59 |
| А из API-Thread у тебя и не получится синхронизировать. Только если использовать синхронизацию метоодом посылки сообщений. |
| Автор: Barovskiy 17.1.2006, 16:44 | ||||
Они нужны так как ProcessMessages совершенно не спасает .... и плюс я бы хотел чтоб за один раз несколько потоков было .... тогда задача еще быстрее будет выполняться
Обязательно почитаю сейчас А как же тогда быть если не управлять VCL |
| Автор: Albinos_x 17.1.2006, 18:18 | ||
| или создавать класс Thread или синхрогизировать через посылку сооьщений
можно в критических местах расставить мессажебоксы и по их появлениям отследить выполнение кода... соответственно если какойто не показался, хотя долже был... значит где-то перед ним возникла ошибка... Добавлено @ 18:21 [яуоте] если просто открыть и закрыть прогу то ничего не выпригивает [/яуоте] а если досрочно прервать выполнение, ошибка вылетает? |
| Автор: Демо 17.1.2006, 18:39 | ||
| Чем пример не подходит?
Дело в том, что потоки пишутся под задачу, и универсальный шаблон сделать нельзя. Универсальный уже есть - File-->New-->Other-->Thread Object. Но это естественно, только лишь самая примитивная заготовка. |
| Автор: Barovskiy 17.1.2006, 18:58 | ||||||||
Все проходит гладко, в процессе работы, все логи я сохраняю в лог лист alexeis1
в коде все нормально проходит .... а вот как закрываю прогу .... бац АшыПка ..... Может я чтото упусти л.....
Синхронизация не получается потому что не очень разбираюсь в потоках и если я сейчас начну создавать отдельный модуль пас с потоком то потом как мне склеить VCL ? я не смогу разбить VCL Саму связь и управление не смогу сделать - уже пробовал не получилось, поэтому я хотел загнать сам цикл в поток в принцепи получилось, но вот меня напрягает сама ошибка после выхода прграммы, это не граммотрно чтото я сделал ... многопоточность у меня не получится сделать таким образом... ну хотябы одним потоком чтоб прога не висла и без ошибок. Может это у меня ошибка в самом цикле???? чтоя мог такого написать с VCL что вылетает инвалид хэндл при закрытии проги???? может чтото еще надо вписать в раздел
????? С Вуажением, БагМэйкер )))))))))))) |
| Автор: Barovskiy 17.1.2006, 19:14 |
| Твой пример Супер!!!!!! Просто помимо проверки IP я хочу туда засунуть другие возможности .... Например загнать прогу в трей и чтоб она проверяла все мои почтовые ящики одним заходом, и выводила мне колличество мои писем.... а если я сейчас загоню это, то мне придется для каждого почтового ящика вешать по одному ПОП компоненту, а если у меня ящиков 10 ... это будет конечно труба.... вот я и хотел повесить один компонент поп и через порверять одним заходом все ящики из настроек .... поэтому я хотел сделать общую заготовку чтоб просто поотом менять содержание цикла и все.... Не получилось ... хотя уверен что можно это сделать, но пока у меня не хватает опыта ..... хотябы примитивные задачи ..... Прерываю - все нормально останавливается, а если закрою - то тоже самое вылетает, ошибка вылетает в любом случае после закрытия прграммы если я хоть раз запускал цикл проблема скорей всего с синхронизацией VCL - но как мне ее сделать не понимаю, в примерах теряюсь, так как понятия не имею что куда писать :-( |
| Автор: Демо 17.1.2006, 19:36 | ||||
Для каждого варианта тебе придется решать свои задачи и проблемы для многопоточного программирования. Общие рецепты слишком общий, чтобы можно было одно решение приспособить для любой задачи. Многопоточное программирование не так уж и сложно, но перед кдированием сложных задач все равно придется разобраться подробно в этой теме. Даже с готовой библиотекой - все равно придется разбираться.
К сожалению, сайт уже не работает. Библиотеку можешь взять вот здесь: ftp://ftp.almar.net.ru/pub/GalaLib.zip |
| Автор: Barovskiy 17.1.2006, 23:21 |
| Демо Спасибо за пример!!!!!!!!!!!!!!!!!! Супер!!!!!!!!!! буду разбираться с ним, можеь что получится!!!!!!!!!! |
| Автор: Barovskiy 18.1.2006, 16:36 | ||
Кажетсяы вот из-за этого вылетает ошибка при закрытии программы
|
| Автор: Albinos_x 18.1.2006, 17:31 |
| врят ли, если до этого ошибки не возникли... |
| Автор: Alexeis 18.1.2006, 17:33 |
| except это уже обработка ошибка возникает между try и except |
| Автор: Barovskiy 18.1.2006, 18:17 |
| Но там все нормально .... Почему, если поставить все действие просот на кнопку то все нормально, программа закрывается без ошибки ((((( как записываю в поток то после закрытия проги вылетает ошибка The exception unknown software exception (0x0eedfade) occurred in the application at location 0x781eb33 а после нее вылетает та ошибка которую я выкладывал раньше exception - и мне кажется что из-за этого .... |
| Автор: Alexeis 18.1.2006, 18:47 |
| А если запустить тот же поток но с другим действием скажем for от 1 до 100000000 - ошибка повторится. |
| Автор: Guedda 18.1.2006, 19:43 | ||
Просто напросто поток не успевает выгрузиться. Попробуй ставить проверку на выгрузку потока. |
| Автор: Barovskiy 19.1.2006, 00:04 | ||||||
У меня цикл - если не конец файла....
как его выгрузить тогда? И как поставить проверку? поток создаю так на нем остановился, так как не вылетает ошибок кроме последней...
|
| Автор: Barovskiy 19.1.2006, 00:27 | ||
Здесь вылетает ошибка что кончился стринг файл и нечего проверять ..... Ели успокоил программу.... )))))))))))))))) |
| Автор: Albinos_x 19.1.2006, 00:45 | ||
попробуй в конце потока выйти из него командой:
|
| Автор: Barovskiy 19.1.2006, 01:30 | ||
Сделал так... всеравно вылетает ((((( |
| Автор: Barovskiy 19.1.2006, 01:50 | ||
| Albinos_x ОГРОНОЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!
Сделал вот так и все заработало!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ОГРОНОЕ СПАСИБО ВСЕМ КТО МНЕ ПОМОГАЛ!!!!!!!!!!!!!!!!!! Я ОЧЕНЬ ВСЕМ ВАМ БЛАГОДАРЕН ЗА ВАШУ ПОМОЩЬ!!!!!!!!!!!!!!!! Добавлено @ 02:04 Но тут же возникает другой вопрос :-) Как из этого примера сделать многопоточность? ведь это только работает в один поток и с одноим циклом, а если заставить его делать этот цикл в двух потоках сразу, или еще больше из преложенных мне ВАМИ ссылок я нашел вот этот пример http://forum.vingrad.ru/index.php?showtopic=41821&unread=1&hl=threads :-) или придется делать по другому ? |
| Автор: Barovskiy 19.1.2006, 02:13 |
| Поправка Прога остается висеть в памяти, не закрывается...... ((((((((((((( |
| Автор: Barovskiy 19.1.2006, 03:01 |
| Кажется меня осенило как можно сделать многопоточность в моем случае ..... позже напишу как я задумал, надеюсь получится.... |
| Автор: Albinos_x 19.1.2006, 16:53 | ||
странно что у тебя это не работает..
|
| Автор: Barovskiy 20.1.2006, 19:50 |
| Albinos_x Работает только если я ставлю ExitThread(0); когда программа закрывается... онклоус но прога из памяти не выгружается ... продолжает висеть в процессах ... |
| Автор: Albinos_x 20.1.2006, 21:53 | ||||
в любом случае вариант
будет вызывать ошибку, т.к. 2 раза закрыть закрыть одно и тоже нельзя...а в этом варианте темболее закрываешь не из потока... программа просто скрывается и виснет... если хочешь закрывать не из потока, то наверно лучше его убить командой:
где H - HANDLE созданного тобой потока... |
| Автор: Barovskiy 29.1.2006, 23:25 | ||
сделал так TerminateThread(ChekIP,0); не компилирует , выдал вот это [Error] Unit1.pas(370): Incompatible types: 'Cardinal' and 'procedure, untyped pointer or untyped parameter' что вмето 0 поставить? |
| Автор: Демо 30.1.2006, 00:15 |
| 1. Вообще-то, дескриптор(Handle) потока у тебя возвращает функция BeginThread, который ты не запоминаешь нигде. 2. TerminateThread - аварийное завершение потока. А нужно ли? 3. Как выше было написано, проще сделать нормальную синхронизацию, а не заниматься садомазохизмом через одно место. 4. Если можешь выслать мне свою программу, высылай - посмотрю, что можно сделать. Тогда стучи в PM. |