Суббота, 21.12.2024, 20:17 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024  
Прошу Вашей помощи
xXxSh@dowxXxДата: Вторник, 28.08.2012, 12:03 | Сообщение # 1
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Всем доброго времени суток!

В общем 3 дня тому назад решил я написать одну программку и вот уже 3й день колдую,шаманю,а с отдельным потоком разобраться так и не получается, суть моей программки заключается в том что она должна находить пиксель с определенно заданным в настройках цветом (в HEX формате) в определенно заданной области экрана, сама же область экрана задается выделением этой области мышкой после нажатия на "Start", после чего происходит сохранение изображения в этой же папке (в принципе не нужная, по забывчивости не убранная мной функция, но может кому и пригодится), и запускается цикл в котором попиксельно проверяется изображение в Image1 в поисках нужного нам пикселя и если он там есть то выводим сообщение с текстом "Найдено!", сам же цикл срабатывает по дефолту с периодичностью в 2 сек., так же этот параметр я вывел в настройки, для удобства, в общем весь функционал описывать я не буду, хоть он и не большой, просто перейду сразу к сути проблемы...
дело вот в чем:
выкладываю исходники двух вариантов программы...

1). В первом случае цикл я вывел в отдельную форму, в процессе написания программы цикл так же тестировался и в главной форме, переписывать не стал, работает одинаково что так что эдак, сам же цикл запускается после выделения нужной нам области экрана, а останавливаться он должен (как было задумано) по нажатию на "Stop", НО к сожалению при запуске цикла главная форма зависает напрочь...

2). В этом случае я решил перенести цикл в отдельный поток, пытался писать поток в отдельном Unit'e, пробовал и в основном Unit'e, добавил синхронизацию с главным потоком, но все равно так и не понял почему в потоке цикл не работает так как нужно, а в первом примере как раз к работе цикла претензий нет, все гладко и идеально, если бы только форма не подвисала, было бы вобще супер!

В общем вот эти два варианта исходников, помогите пожалуйста разобраться, кто что знает?

PS: Не обращайте внимание на Timer1 он изначально отключен, просто первый вариант был сделан не через цикл, а через таймер, но вариант с таймером после некоторых тестов отпал, код забыл убрать...
Прикрепления: bez_potoka.rar (28.5 Kb) · v_potoke.rar (28.9 Kb)


Сообщение отредактировал xXxSh@dowxXx - Вторник, 28.08.2012, 12:06
 
Волк-1024Дата: Среда, 29.08.2012, 01:48 | Сообщение # 2
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Я думаю, что проблема в юните 2. Т.к при нажатии старт прога ждет и виснет форма пока не выделишь область. Я так предполагаю, что из-за этого, ибо посмотрел код бегло. (Смотрел код, который без потока).

Сообщение отредактировал Волк-1024 - Среда, 29.08.2012, 02:08
 
xXxSh@dowxXxДата: Среда, 29.08.2012, 10:40 | Сообщение # 3
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Quote (Волк-1024)
Я думаю, что проблема в юните 2. Т.к при нажатии старт прога ждет и виснет форма пока не выделишь область.


Вовсе нет, Unit2 тут не при чем, дело в том что форма виснет когда начинает работать цикл, а сам цикл начинает свою работу только после того как мы отпускаем Mouse1 выделив область экрана,то есть до этого момента цикл не запустится...

а весь код цикла находится в Unit6 работая на отдельной Form6, не зависимо от Unit2, так как Unit2 его только запускает после выделения...

В общем на сколько я правильно понял, нужно весь цикл перенести в отдельный поток таким образом что бы не потерять нормальную работоспособность, как это сделать?


Сообщение отредактировал xXxSh@dowxXx - Среда, 29.08.2012, 10:42
 
xXxSh@dowxXxДата: Суббота, 01.09.2012, 21:35 | Сообщение # 4
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Волк-1024 от части все таки ты оказался прав, да действительно дело в Unit2, но не после нажатия старт, так как оно же так и запланировано, нажимаем старт, выделяем область, а далее программа начинает работать..., дело было еще в том что по какой то не ведомой мне причине команда Form2.Close; не срабатывала в Unit2, это я исправил, но с потоком так и не вышло, почему то со временем поток умирает, сам по себе, не могу понять почему так...
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz