Author Topic: Синхронизация последовательности потока  (Read 6538 times)

0 Members and 4 Guests are viewing this topic.

3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
"родительский и все дочерние потоки имеют общий доступ к графическому буферу и переменным"
Ищем картинки в потоках, в результате получаем ошибки интерпритации win 10 x64 или vm xp sp3 находит одну и туже либо что-то среднее,
версия
CM4.12.001
[spoiler]
Code: (clickermann) [Select]
GETSCREEN
THREAD(thr_name1)
   // тело потока
LOGWRITE ("Сообщение1")

 

SCANPICTURE($ARR_SCAN, 0,0, $_xmax,$_ymax, "PIC1.bmp", -1, 100)

$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   MOVE($X, $Y)   // перемещаем курсор
   LOGWRITE ("P1X: ", $X, " Y: ", $Y)
   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)

HALT

   waitms(10) // задержка для разгрузки CPU
END_THREAD
// поток
THREAD(thr_name)
   // тело потока
LOGWRITE ("Сообщение2")

 


SCANPICTURE($ARR_SCAN1, 0,0, $_xmax,$_ymax, "PIC2.bmp", -1, 100)

$ARR_NUM1 = 0
WHILE ($ARR_NUM1 < ARRSIZE($ARR_SCAN1))
   $X = $ARR_SCAN1 [$ARR_NUM1]
   INC($ARR_NUM1,1)
   $Y = $ARR_SCAN1 [$ARR_NUM1]
   INC($ARR_NUM1,1)
   MOVE($X1, $Y1)   // перемещаем курсор
   LOGWRITE ("P2 X1: ", $X1, " Y1: ", $Y1)
   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN1)

HALT

   waitms(10) // задержка для разгрузки CPU
END_THREAD
[/spoiler]
« Last Edit: November 26, 2016, 01:53:39 PM by 3333333333 »
Всё гениальное - просто

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Quote
"родительский и все дочерние потоки имеют общий доступ к графическому буферу и переменным"
так оно и есть. у тебя координаты обеих картинок пишутся в один массив $ARR_SCAN одновременно,. отсюда и непойми что на выходе.

в добавок к этому еще и наращиваемая переменная $ARR_NUM наращивается одновременно. вернее не одновременно, а поочереди, то в одном потоке, то во втором.

в добавок к этому, еще и переменные х и у в потоках одни и теже.

да и вообще, из массива с координатами проще читать так:


Code: (clickermann) [Select]
FOR($a=0,$a<ARRSIZE($ARR_SCAN),2)
   $X = $ARR_SCAN [$a]
   $Y = $ARR_SCAN [$a+1]
END_CYC
« Last Edit: November 24, 2016, 07:20:55 PM by dramster »

3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
Я так и предполагал, спасибо за ответ будем двигаться в правильном направлении :)
Всё гениальное - просто

3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
Quote
"родительский и все дочерние потоки имеют общий доступ к графическому буферу и переменным"
так оно и есть. у тебя координаты обеих картинок пишутся в один массив $ARR_SCAN одновременно,. отсюда и непойми что на выходе.

в добавок к этому еще и наращиваемая переменная $ARR_NUM наращивается одновременно. вернее не одновременно, а поочереди, то в одном потоке, то во втором.

в добавок к этому, еще и переменные х и у в потоках одни и теже.

да и вообще, из массива с координатами проще читать так:


Code: (clickermann) [Select]
FOR($a=0,$a<ARRSIZE($ARR_SCAN),2)
   $X = $ARR_SCAN [$a]
   $Y = $ARR_SCAN [$a+1]
END_CYC
Уважаемый, подскажите пожалуйста функция bgcolor какую градацию имеет кроме (-1), это к какому фону изображения относится?
Всё гениальное - просто

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
В подготавливаемом фрагменте нужно закрасить, каким то цветом, то что должно считаться прозрачностью.
Этот цвет и нужно указать за место -1. Это будет считаться маской прозрачности.

3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
В подготавливаемом фрагменте нужно закрасить, каким то цветом, то что должно считаться прозрачностью.
Этот цвет и нужно указать за место -1. Это будет считаться маской прозрачности.
[spoiler]

[/spoiler]
Какую маску для этого рисунка применить?
Всё гениальное - просто

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Картинка слишком большая, но если взять уголок, применить цветокоррекцию 6ого уровня и вызезать белый фон то так.
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(6)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", 65280, 80)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF

3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
Картинка слишком большая, но если взять уголок, применить цветокоррекцию 6ого уровня и вызезать белый фон то так.
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(6)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", 65280, 80)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF
Для вырезания белого фона gimp подойдёт?
я конечно нуб, но видел писал кто -то IF_PICTURE_IN -это зло, проверено. Полагаю ,Лучше индексировать массив данных изображения("векторизировать") процедурой scanpicture, снимок экрана.
Там ралли, и 80% долго будет тормозить, я буду в хвосте...
« Last Edit: November 29, 2016, 01:52:18 PM by 3333333333 »
Всё гениальное - просто

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
я конечно нуб, но видел писал кто -то IF_PICTURE_IN -это зло, проверено.
Не всё правда, что на заборах написано.

Полагаю ,Лучше индексировать (векторизировать) процедурой scanpicture, снимок экрана.
??? WTF

Векторизация?... Кликермэн даже с таким понятием не знаком, все команды работают с растром.

Как SCANPICTURE должна ускорить по сравнению с IF_PICTURE_IN ?
Анекдот в тему:
Quote
Шерлок Холмс и доктор Ватсон едут в поезде. Увидев в окно стадо овец, Ватсон заметил:
- Посмотрите, Холмс, какое большое стадо.
Да, немалое, - лениво бросает Холмс, - целых семьсот восемьдесят четыре овцы.
- Господи. Холмс! - восклицает Ватсон. - Не ужели вы их успели пересчитать?
- Конечно, только не овец. Этот фокус знает любой школьник. Я просто пересчитал ноги и разделил полученное число на четыре.



3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
хз
[spoiler]
Code: (clickermann) [Select]
GETSCREEN

SCANPICTURE($ARR_SCAN, 0,0, $_xmax,$_ymax, "picture.bmp", -1, 100)

$ARR_NUM = 0
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   MOVE($X, $Y)   // перемещаем курсор
   LOGWRITE ("X: ", $X, " Y: ", $Y)
   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)

HALT

GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF
[/spoiler]
ооооооо да раз пошло такое отклонение от темы, мне тоже любопытно, я конечно поправлюсь индексация массива данных изображения, мне проще называть "векторизация", может кого-то и ввёл в заблуждение извиняюсь
но вот 2 примера из шаблона ну не работают 100%, первый сработает на 95% если только процедура MOVE($X, $Y)   // перемещаем курсор будет далеко за пределами да и после задержки
второй 50 на 50 практического применения у меня не нашло, как бы я не "мудрил" с параметрами в топку...
Всё гениальное - просто

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
ооооооо да раз пошло такое отклонение от темы, мне тоже любопытно, я конечно поправлюсь индексация массива данных изображения, мне проще называть "векторизация", может кого-то и ввёл в заблуждение извиняюсь

А мне проще называть "корреляция", а по средам "абстракция"... Но это никак не поможет лучше меня понимать.
Ладно, замяли, это мне не нужно было комментировать.

но вот 2 примера из шаблона ну не работают 100%, первый сработает на 95% если только процедура MOVE($X, $Y)   // перемещаем курсор будет далеко за пределами да и после задержки
второй 50 на 50 практического применения у меня не нашло, как бы я не "мудрил" с параметрами в топку...
При чём здесь MOVE, совсем непонятно.

Нужно понять как действует поиск, что когда сверяется и станет ясно как это настроить. Не нужно бросаться и ставить цвет прозрачности и пр.

По отличиям.
IF_PICTURE_IN после нахождения первого совпадения образца прекращает работу и возвращает координаты в $_return1, $_return2.
SCANPICTURE Проходит ВСЮ указанную зону. Практически, внутренне это последовательность вызовов IF_PICTURE_IN с занесением результатов в массив.
В поиске отличий нет. Совсем. При тех же параметрах. Не может такого быть что SCANPICTURE найдёт, а IF_PICTURE_IN нет.

Если хочешь решить свой вопрос с поиском, то опиши точно задачу: где искать, что искать. Опиши что это такое. Скрины сделай.
Проанализируй не изменяется ли изображение - сдвиги, масштаб, цвет, затенение, подсветка, сглаживание.
Если проблема с поиском заготовки, сделай несколько скринов в разные моментывремени (не подряд). Желательно после перемещения окна/поля, смене локации туда-сюда, перезапуске приложения и т.д.


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Не знаю что такое gimp, использую фотошоп. Но и стандартный Paint для этих целей сгодится.

Фон вырезать приходится в редких случаях. Обычно достаточно вырезать маленький фрагментик из искомого изображения, не забыв сделать цветокоррекцию и применив процент нахождения.

Функции должны работать одинаково. IF_PICTURE_IN останавливается сразу после нахождения 1 фрагмента, а SCANPICTURE продолжает анализ до конца области пытаясь найти все вхождения, что увеличивает время.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Я говорил про конкретную задачу поиска картинки. С которой проблемы.


3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
Я говорил про конкретную задачу поиска картинки. С которой проблемы.
Посмотрите пожалуйста Вышеили
тут
[spoiler]

[/spoiler]
« Last Edit: November 30, 2016, 07:27:47 AM by 3333333333 »
Всё гениальное - просто

3333333333

  • Освоившийся
  • **
  • Posts: 33
    • View Profile
Посмотрите пожалуйста Выше
  ::) Вот ::) это ::) всегда ::) пожалуйста, ::) а ::) то ::) обычно ::) наоборот ::) говорят;  ::) "смотри ::) под ::)  ноги  ::) или ::) смотри  ::)  куда  ::) прёшь?!" ::)  ::)  ::)  ::)  :o  ::)  ::)   ::)  ::)                                                                     
            Ответ Был            НЕ Тебе ИДИ мимонапиши, что по теме?
« Last Edit: November 30, 2016, 02:48:29 PM by 3333333333 »
Всё гениальное - просто