Author Topic: SENDMESSAGE  (Read 8067 times)

0 Members and 1 Guest are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: SENDMESSAGE
« Reply #30 on: June 24, 2019, 12:49:04 PM »
Вопрос возник, ребят. Не понятен параметр один.
Code: (clickermann) [Select]
IF($isnew != 0)
Путем проб, я вычислил, что если сообщений не поступает, то $isnew = 0, а если сообщение поступило, то $isnew = 1. На сколько я понимаю, условие "!=" = "не равно или равно", но тогда оно должно срабатывать, и тогда, когда сообщений нет, и тогда, когда они есть...
У меня вот нормально работает:
Code: (clickermann) [Select]
IF($isnew ! 0)
Что я не правильно понял?

« Last Edit: June 24, 2019, 01:00:11 PM by Hito »
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: SENDMESSAGE
« Reply #31 on: June 24, 2019, 01:33:04 PM »
! и !=  это синонимы. Означают "не равно".

"!=" ведено в последних версиях для тех кто привык к другим языкам, в большинстве их "не равно " обозначается так.
Если версия кликера старее, то такое условие не сработает.


Ты в этом своём сообщении
http://crapware.aidf.org/forum/index.php?topic=4720.msg32297#msg32297
условие перепутал местами. Или знак должен быть "равно" или действия наоборот.
« Last Edit: June 24, 2019, 01:35:24 PM by Vint »


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: SENDMESSAGE
« Reply #32 on: June 29, 2019, 07:06:24 AM »
Отпадает по ходу у меня вся эта тема... Все получается, но проблема в том, что в скрипте кликера отлов входящих сообщений естественно крутится в цикле потока, у которого естественно есть задержка хотя бы в 50мс (для разгрузки процессора), но за эти 50мс может прийти, скажем - три сообщения, и скрипт естественно поймает одно (последнее), а два первых улетят в пустоту.
Я не ду... Потому и не бу...

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Re: SENDMESSAGE
« Reply #33 on: June 29, 2019, 08:26:27 AM »
допиши двунаправленную свзяь для синхронизации и проблемы не будет
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: SENDMESSAGE
« Reply #34 on: June 29, 2019, 12:44:56 PM »
По идее пропускать не должно. Ты же используешь POSTMESSAGE? Не SENDMESSAGE?
При пост, винда организует очередь сообщений для приложения.
Покажи тесты где теряются сообщения.


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: SENDMESSAGE
« Reply #35 on: July 01, 2019, 11:42:58 AM »
Покажи тесты где теряются сообщения.

Сорри - я не тестировал. Просто в delphi, например, я создаю процедуру, которая срабатывает при каждом получении сообщения, а в кликере получение сообщений у нас крутится в цикле, у которого конечно есть пауза. Вот я как бы логически и предположил...
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: SENDMESSAGE
« Reply #36 on: July 01, 2019, 01:18:19 PM »
в скрипте кликера отлов входящих сообщений естественно крутится в цикле потока, у которого естественно есть задержка хотя бы в 50мс (для разгрузки процессора), но за эти 50мс может прийти, скажем - три сообщения, и скрипт естественно поймает одно (последнее), а два первых улетят в пустоту.
Ну поставь 10 мс. И напиши двунаправленную и правда. Сделай в lParam? например, hwnd передающего окна. При приёме отправляй ответ-подтверждение.
В передающем после каждой команды отправки жди подтверждения, если нет в течении N мс отправляй повторно.

Ты так и не сказал нужно передавать текст или нет. Может достаточно команд.


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: SENDMESSAGE
« Reply #37 on: July 01, 2019, 02:01:38 PM »
Ты так и не сказал нужно передавать текст или нет. Может достаточно команд.
Команд не достаточно. Дело в том, что в одной команде может быть несколько параметров, таких, как например - 1: номер мира в игре, для которого предназначается команда. 2: номер канала в выбранном мире, для которого предназначается команда. 3: номер группы, в которой находится персонаж, находящийся в выбранном мире и на выбранном канале. 4: класс персонажа в выбранной группе. Например, в ини у меня скрипт ориентируется так:
Code: (clickermann) [Select]
INIREAD(STRCONCAT("ini\",$mir,"\",$group,"\",$class,".ini"), "canal", "1")Если передавать только числа, то нужно в них какой-то делитель мутить, чтоб принимая сообщение, скрипт мог бы разбивать строку по этому делителю и тогда уже работать с подстроками. Но вся проблема в том, что числа ничем не разбить - в сообщении числовом не может быть отправлено ничего, кроме цифр...
« Last Edit: July 01, 2019, 02:04:24 PM by Hito »
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: SENDMESSAGE
« Reply #38 on: July 01, 2019, 03:48:00 PM »

Команд не достаточно. Дело в том, что в одной команде может быть несколько параметров, таких, как например - 1: номер мира в игре, для которого предназначается команда. 2: номер канала в выбранном мире, для которого предназначается команда. 3: номер группы, в которой находится персонаж, находящийся в выбранном мире и на выбранном канале. 4: класс персонажа в выбранной группе.
Сколько всего миров в игре? Максимальный номер канала? Количество групп? Класс персонажа это число? Какое максимальное?
Дело в том, что если эти значения не большие, то их всех можно всунуть в один параметр, разделив его на нужное для каждого значения количество бит. Если в один параметр не влезут, то есть второй.  При приеме сообщение снова разделяешь на начальные значения.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: SENDMESSAGE
« Reply #39 on: July 01, 2019, 04:46:32 PM »
Вот набросал обьединение четырех параметров в один, где максимальное значение каждого из начальных параметров не больше 255, по одному байту. И последующее разделение на начальные параметры.

Code: (clickermann) [Select]
$mir = 32
$channel = 175
$group = 98
$class = 233


// соединяем
$parameter = $mir + $channel*256 + $group*65536 + $class*16777216

print("объединенный параметр = ", $parameter) //  3915558688


////////////////////////////////////////////////////////////////////////////////


//разбиваем
$re_class = int($parameter/16777216)
$re_group = int(($parameter-$re_class*16777216)/65536)
$re_channel = int(($parameter-$re_class*16777216-$re_group*65536)/256)
$re_mir =  $parameter - $re_channel*256 - $re_group*65536 - $re_class*16777216

print(" ")
print("разбитый параметр:")
print("mir=", $re_mir," channel=", $re_channel, " group=", $re_group, " class=", $re_class)
halt


Лог:
Code: (лог) [Select]
16:47:35 объединенный параметр = 3915558688
16:47:35 
16:47:35 разбитый параметр:
16:47:35 mir=32 channel=175 group=98 class=233
« Last Edit: July 01, 2019, 04:51:35 PM by dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: SENDMESSAGE
« Reply #40 on: July 01, 2019, 04:49:01 PM »
Вот, вот. Всё пытаюсь к этому подвести. Запаковать биты и отправить одним параметром это совсем не то, что передавать текст как серию параметров, да потом ещё и текст расшифровывать.

Но не исключаю и необходимость текстовой информации.
Если общаются две программы, то достаточно задержки. Если действительно приёмник один, а передатчиков несколько, они могут посылать в одно время.
Как выяснилось GETMESSAGE в кликере работает по очень простой схеме и переход с POSTMESSAGE на SENDMESSAGE ничего не даёт (может даст в одностороннем порядке на сервере, как там делфи будет обрабатывать). Или SENDMESSAGE  не ждёт. Короче кликер с кликером ничего не ждёт.

Вот с подтверждением получилось так
Приёмник
Code: (clickermann) [Select]
#name "SENDMESSAGE-GETMESSAGE_Receiver"
// Author: Vint
// Version: 0.1 (01.07.2019)
// Скрипт для Clickermann v4.13.14

LOGCLEAR

$WM_tr = 2000  // код сообщения у передатчиков


WHILE(1)
    define($str, "")
    GETMESSAGE($wp, $lp, $isnew)
   
    IF($isnew != 0)
        // отправляем подтверждение
        POSTMESSAGE($lp, 2000, 1, $lp)
       
        IF($wp ! 0)
            $str = strconcat($str, char($wp))
            LOGWRITE("сообщение  ", char($wp),  "  wParam:", $wp, "  от ", $lp)
        ELSE
            $event = $str
            $str = ""
            // здесь обрабатываем наше сообщение
            LOGWRITE("Принята строка: ", $event, "  от программы ", $lp)
        END_IF
    END_IF
    WAITMS(5)
END_CYC

HALT

Передатчик
Code: (clickermann) [Select]
#name "SENDMESSAGE-GETMESSAGE_Receiver Transmitter"
// Author: Vint
// Version: 0.1 (01.07.2019)
// Скрипт для Clickermann v4.13.14

#define @CRLF:STRCONCAT(char(13),char(10))

LOGCLEAR
print("Передатчик", @CRLF)

$WM_re = 1024  // код сообщения у приёмника
$hwnd_re = wndfind("SENDMESSAGE-GETMESSAGE_Receiver")

SUB(wait_confirmation, $cwp)
    $confirmation = 0
    $time_conf = $_ms + 300
    WHILE($confirmation = 0)
        GETMESSAGE($wp, $lp, $isnew)
        IF(($isnew ! 0) & ($lp = $_hwnd_self))
            $confirmation = 1
            //print("-------------------------подтверждено")
        END_IF
       
        IF(($time_conf < $_ms) & ($confirmation = 0))
            // отправляем запрос повторно
            SENDMESSAGE($hwnd_re, $WM_re, $cwp, $_hwnd_self)
            $time_conf = $_ms + 300
            //print("ПОВТОРНО ", $cwp)
        END_IF
        WAITMS(3)
    END_CYC
END_SUB

SUB(Send_message, $t)
    $len = STRLEN($t) + 1
    FOR($i=1, $i < $len)
        $chr = STRCUT($t, $i, 1)
        $cod = code($chr)
        print("передаём  ", $chr, "    -  ", $cod)
        SENDMESSAGE($hwnd_re, $WM_re, $cod, $_hwnd_self)
        WAITMS(3)       
        wait_confirmation($cod)
    END_CYC
   
    SENDMESSAGE($hwnd_re, $WM_re, 0, $_hwnd_self)  // wParam = 0 строка окончена
    wait_confirmation(0)
    print("--- Передали! ---", $t)
END_SUB

IF($hwnd_re ! 0)   
    Send_message("Очень важный текст")
   
    print("")
    //WAITMS(1000)
   
    Send_message("Второй текст")
END_IF


HALT