Страница: 1 |
Страница: 1 |
Вопрос: Классы, Объекты, Потоки, Запутался, Помогите
Добавлено: 12.05.11 04:03
Автор вопроса: akukinakis
Пару дней хожу с квадратной головой, думая над решением своей задачи и над тем как лаконично сформулировать свой вопрос для форума :)
Короче, нужен совет решения след.задачи:
ЧТО УЖЕ ИМЕЕТСЯ: Имеется моя программа, выполняющая манипуляцию мышью с окном другого приложения на экране (клики ЛКМ, либо ПКМ с последующим выбором пункта конт.меню). При работе с одним приложением все работает отлично.
Сейчас потребовался одновременный запуск двух и более приложений, и соответственно, стольких же копий моей программы.
Я вынес основной блок кода в класс, соответственно, создаю объекты и запускаю каждый в своем потоке. Таким образом организована одновременная работа нескольких "копий" программы.
ПРОБЛЕМА: Перед кликом, каждая "копия" программы делаем окно обрабатываемого приложения активным (выносит на первый план), чтобы щелчки мыши не пришлись на другое окно и начинает выполнять манипуляции, требующие, до нескольких секунд, времени. После этого пауза на неопределенное время, после чего все повторяется.
В случае, если одновременно нескольким копиям понадобилось получить управление, и место клика, перекрывается другим окном, происходит сбой: пара кликов нет да и придется на другое окно, только что ставшее активным (если оно перекрывало место клика на первом окне).
ВАРИАНТ РЕШЕНИЯ: Я думаю решить это след.образом: Каждая копия, перед выполнением своих действий должна перехватить управление, т.е. приостановить работу остальных копий (потоков) методами thread.suspend() или thread.Sleep(3000).
Долго пытаюсь заставить все это работать, но пока не получается...
ВОПРОС:
Как из одного потока приостановить работу другого на пару секунд? Или может есть другие идеи..
ДА и, избежать перекрытия окон не получится..
'Чесно, максимально коротко пытался написать. Спасибо
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 12.05.11 12:28
для этого нужно использовать механизмы синхронизации. Простейшее что может подойти - Monitor (через него также работает конструкция lock/SyncLock)
Номер ответа: 2
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #2
Добавлено: 12.05.11 23:47
Я бы дополнил.. у него разные копии приложения, а lock(Monitor),если не ошибаюсь, работает в рамках одной копии, точнее одного процесса. Поэтому,имхо, ему более подойдет Mutex
Ты должен различать понятия потоки и процессы. Если у тебя потоки запущены в рамках одного процесса(1 копии приложения) то подойдет Monitor, если разные процессы то Mutex
А вообще достаточно сумбурно сформулировано(хоть и видно что старался).. Лично я так и не понял. Говоря о нескольких копиях ты что имел ввиду: Несколько копий твоего приложения или несколько копий контроллируемого приложения? (к примеру 3 копии MS WORD открыто и ты там что то кликаешь)
Номер ответа: 3
Автор ответа:
akukinakis
Вопросов: 2
Ответов: 8
Профиль | | #3
Добавлено: 13.05.11 06:45
Простейшее что может подойти - Monitor
Если у тебя потоки запущены в рамках одного процесса(1 копии приложения) то подойдет Monitor, если разные процессы то Mutex
Нашел информацию о Mutex, буду разбираться на выходных. Вроде то, что нужно. Почитаю еще о Monitor.
Большое человеческое спасибо!