![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Andreyzpr |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Вообщем столкнулся с такой проблемой:
Происходит запуск процедуры в отдельном потоке 255 раз. Запуск процедуры происходит следующим способом:
сама процедура такого типа:
А проблема такова. Мне нужно, чтобы при запуске процедуры ей передался параметр (в моем случае IP адрес): Тоесть мне нужно вызвать процедуру таким способом: ScanNetwork('127.0.0.1'); А проблема такова: Когда я запускаю в отдельном потоке процедуру таким способом:
т.е. передаю ей параметр, то программа не запускается, подчеркивает эту строчку и пишет ошибку: [Error] Unit1.pas(102): Variable required Если же я бещз скобок будут запускать ее (не буду давать параметр) то тогда все нормально запускается, а так получилось, что мне обязательно нужно передать ей параметр. Пробовал решить с помощью переменных - не получилось, процедура во время работы в сети медлительна - цикл где переменная изменяется работает быстрее.... Как мне сделать, чтобы можно таки было передать процедуре параметр? |
||||||
|
|||||||
| skyboy |
|
||||||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
объяви ещё одну процедуру.
и работай с ней
Да, это негибко. Но сделать эту самую some_proc параметризированной можно только если: а) объявить глобальную переменную needle_ip
Если эта глобальная переменная будет меняться только в основном потоке - все будет нормально, в противном случае потребуется синхронизация. б) переделать CreateThread(или написать обертку), которая позволит работать как с ^procedure, так и с ^(procedure of object) самый адекватный по-моему: В) третий с конца параметр функции CreateThread - единственный параметр, передаваемый в указанную функцию. У тебя там стоит self. Лучше передать ip d виде числа. Или указатель на строку. А ты сейчас передаешь self, который потом пытается приводиться к строке(смотри объявление процедуры scanNetwork) Добавлено через 59 секунд из трех приведенных вариантов правильный - "В". Просто писал по мере прихода мыслей, остальное надо было удалить, чтоб не запутывать. |
||||||
|
|||||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Andreyzpr, А лутше воспользуйся классом TThread, где почти все уже за тебя сделано. Я как понял тебе же не обязательно чистый WinApi?
Это сообщение отредактировал(а) Rennigth - 12.10.2007, 14:50 -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
skyboy тоесть как заместо self передать?
Rennigth если чесно не умею єтим классом пользоваться |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Rennigth, а что это даст? Метод Execute в любом случае не имеет параметров. Правда параметры можно передать в конструктор класса. А еще он позволяет синхроинзироваться с VCL классами/данными основного потока.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Воспользуйся поиском по слову TThread, найдешь массу примеров. А с BeginThread/CreateThread замучаешься с синхронизацией если понадобиться. Ничего личного, но просто у тебя опыта может не хватить все грамотно написать на API. Добавлено через 58 секунд Я о том же. Добавлено через 1 минуту и 50 секунд Или отдельными св-ми с резюмом трэда ручками. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
А так в принципе почему вот так не передавать?
Добавлено через 2 минуты и 30 секунд у CreateThread же 4й параметр для передачи параметров и существует. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
||||
|
||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Rennigth твой пример не работает :( С Опытом согласен, я только учусь
Добавлено через 3 минуты и 33 секунды А что за 4 параметр для передачи? Куда он передает? Откуда извлечь его можно? |
|||
|
||||
| Rennigth |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
эт почему? Покажи как ты вызываешь функцию. stdcall указал? Добавлено через 3 минуты и 47 секунд
Посмотри внимательней мой пример. 1. Процедура которая передается в трэд должна обязательно иметь вид:
2. 4й параметр функции CreateThread это указатель на параметр который передасться в Param процедуры трэда. 3. Обязательно процедура трэда должна быть stdcall. -------------------- (* Honesta mors turpi vita potior *) |
||||
|
|||||
| Andreyzpr |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Вообщем заработало, только появилась другая проблема! По завершении работы программа выбрасывает ошибку.. В чем тут недоработка:
Вот сама процедура:
Обращаю внимание на то, что основные действия в процедуре закомментированы, т.е. что делает процедура - просто в мемо пишет: Сканируем адрес и добавляет переданый параметр. ЗАпуск происходит так:
Все выводитяс в мемо и как только цикл завершается выходит ошибка и открывается окно CPU и море ошибок. В чем проблема? |
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
||||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
эх, вот никто меня и не слушает... :(
вот что эт такое? нельзя же так... я же не зря вот это говорил. Лан все поправимо, сейчас доработаю твой пример. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Andreyzpr |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Извеняюсь за невнимательность, если не трудно, скажи где ошибся? ;) |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Andreyzpr, ты ж в потоке обращаешься к памяти которая используется одновременно и основным потоком тоже.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Тоесть ты говориш про переменную TempString? |
|||
|
||||
| Rennigth |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
вот например такой примерчик. Не покушаюсь на оптимальнось и оригинальность. Хендлы тож конечно поздно закрываются, но с евентами не хочется возится. Я поэтому и предлагал TThread использовать Добавлено через 4 минуты и 12 секунд нет я о том что нельзя из отдельного потока напрямую использовать VCL. Я вот об этом:
Это не потоко безопасно! В моем примере передача данных форме сделана через очередь сообщений, это один из самых простых способов. Иначе, надо ручками организовывать синхронизацию, что без определенного опыта(которого и у меня особо нету) проблематично. -------------------- (* Honesta mors turpi vita potior *) |
||||
|
|||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
ууууууууууу :( :( :( :( :(
А мой код в чувство никак привести нельзя? Вроде ж все работает, а по завершении цикла :( :( :( !! |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
К сожалению нет Добавлено через 4 минуты и 19 секунд Andreyzpr, чтобы понять почему так почитай, хошая статья http://forum.vingrad.ru/topic-60076.html Добавлено через 8 минут и 40 секунд Andreyzpr, ты попробуй мой пример, там ничего сверх естественного нету. Работать с сетью в отдельном потоке можно, ничего страшного не будет. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Я уже ту статью читал :(
Я совершенно не могу понять твоего кода.. что и куда вставить!!, КАк я могу не использовать VCL если мне результат выводить надо... Незнаю что такое constructor; И самое плохое то что я показал была упращеная версия, и если бы она заработала там бы намного больше циклов шло бы.... А из за чего неработоспособна моя версия? Что там создает ошибку? |
|||
|
||||
| Rennigth |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Constructor/Destructor это примерно тоже самое что и события OnFormCreate/OnFormDestroy, все можно было и туда вставить, просто я так привык
В моем примере же выводиться. Обрати внимание на то, что я из процедуры трэда выполняю PostMessage, т.е. я посылаю сообщение главной форме с текстом "сканируем адрес и т.д.". А главная форма ловит это сообщение(метод ThreadInfoEvent) , и уже она добавляет этот текст в memo.
1. То что напрямую обращаешся к VCL. 2. Перед тем как ты передаешь указатель на параметр в процедуру трэда, ты для нее явно не выделяешь память, в итоге при выходе из области видимости, дельфи сама подчишает память, а ты в трэде пыташься ее использовать. Но это уже даже проблема не то что отдельный трэд, а так устроена дельфи, это просто всегда надо учитывать. Это сделано вприципе для облегчения жизни делфи-программиста, но есть случаи(как данный), когда это доставляет определенные трудности. Это сообщение отредактировал(а) Rennigth - 12.10.2007, 18:10 -------------------- (* Honesta mors turpi vita potior *) |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
я бы так не стал делать никто не гарантирует, что сообщение будет обработано до того, как освободится память под ltmp после завершения потока -------------------- There are always someone smarter than you... |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
MetalFan,
мб... А если подумать то еще надо посмотреть как устроен PostMessage. Ведь когда отправляешь сообщение другому процессу ты же не заботишься о сохранности памяти... тем более что она выделена в другом процессе... -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 3 Всего: 158 |
а выделение памяти в контексте АП получателя - это работа для WM_COPYDATA, причем SendMessage. если и посылать асинхронно в пределах одного АП, то тогда выделять перед посылкой и освобождать после приема. хотя в данном конкретном случае неявную помощь может оказать "вумный" стринг - но тут я ни разу не уверен. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
сорь, но не понял, о чем речь -------------------- There are always someone smarter than you... |
|||
|
||||
| Andreyzpr |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Думал, думал.. всетаки додумался как провернуть с переменными.. вроде работает, правда на 100% не уверен в работоспособности... Сделал таким способом:
Запуск?
где a это массив а index Integer; Сама процедура:
Вообщм по такому принципу пустил... Впринципе, можно и ставить вопрос решенным, т.к. по другому ничего придумать нельзя :( :( :( |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
нехорошо очень нехорошо можно. плохо видимо придумывал -------------------- There are always someone smarter than you... |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 3 Всего: 158 |
![]() слов нет. одни эпитеты. и те не для огласки. Andreyzpr, если ты не хочешь понимать, что и как происходит, то не мучай ни себя, ни других, а просто задай вопрос в ЦП. такое впечатление, что человек просто проигнорил все ответы от начала и до конца топа... |
|||
|
||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
НУ я совершенно не понимаю ваших данный мне кодов! Это одно и тоже что я буду ехать на машине и не знать конструкции двигателя, и где то посередине дороги она сломается, и как мне ее дальше ремонтировать?
Ну скопирую я сейчас код, вставлю его, что от этого изменится? Захочу чтото подменить, добавить, или со временем усовершенствовать - а что там и как совершенно не понимаю и ничего не смогу сделать...!!! Поэтому смысла тупо выделить тот код, нажать Ctrl+C, на форме Ctrl+V не вижу... Добавлено через 1 минуту и 12 секунд Ну вон вы говорили про PostMessage, а я не знаю что оно такое! Не пойму о чем спор там идет... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Andreyzpr ты уже едешь на поломаной машине. Нужно подучить работу с потоками, а то будешь ломаться машина каждые 200м.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Тоже верно А может есть какая нибудь книга про потоки? Я видел в интернете статьи, но там пишет например: Создаем поток и десять строчек кода! А где, что и какой параметр указывается не говорится, поэтому что либо понять сложно... |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Согласен, погорячился, выделять отдельно память надежнее в данном сллучае. Заносит иногда. Сам сейчас читаю, и не вижу нити своих мыслей -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Andreyzpr, почитай Рихтера например... я например много чего нового для себя вынес из его книги про программирование под Win.
а про потоки опять же статейка здесь была нелпохая. -------------------- There are always someone smarter than you... |
|||
|
||||
| Andreyzpr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 4.2.2007 Где: Украина Репутация: 1 Всего: 1 |
Мда, думал обойтись всетаки без потоков, но никак.. Пришлось таки помучиться с вашим кодом. Мышка слава богу целая осталась
А код таки работает |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |