Прошу Вашей помощи
| |
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 он изначально отключен, просто первый вариант был сделан не через цикл, а через таймер, но вариант с таймером после некоторых тестов отпал, код забыл убрать...
Сообщение отредактировал 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, это я исправил, но с потоком так и не вышло, почему то со временем поток умирает, сам по себе, не могу понять почему так...
|
|
| |
|