Вверх ↑
Этот топик читают: Гость
Ответов: 4631
Рейтинг: 749
#76: 2015-01-15 15:28:03 ЛС | профиль | цитата
[offtop]Galkov, выше так и написал[/offtop]
карма: 26

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#77: 2015-01-15 15:28:10 ЛС | профиль | цитата
Netspirit писал(а):
а какой смысл в doDestroy?

А вдруг понадобится удалить событие внутри схемы. А так получится, что оно будет висеть, пока не закроется приложение.
карма: 22

0
Ответов: 4631
Рейтинг: 749
#78: 2015-01-15 15:30:01 ЛС | профиль | цитата
А что значит "удалить событие"? Чтобы оно больше не возникало? Так не делать doSet или отключать WaitObject...
карма: 26

0
Ответов: 9906
Рейтинг: 351
#79: 2015-01-15 15:30:16 ЛС | профиль | цитата
Netspirit писал(а):
А какой смысл в doDestroy?
Поддерживаю
Глупости все это.
Окамм писал(а):
Не вводи новые сущности без необходимости

карма: 9

0
Ответов: 4631
Рейтинг: 749
#80: 2015-01-15 15:31:40 ЛС | профиль | цитата
Вообще, doCreate, doDestroy можно было бы использовать только если имя события должно задаваться в runtime. Практического смысла в этом немного, но если бы нужно было, достаточно сделать св-во Name внешним и всё.
nesco писал(а):
понадобится лишний компонент
Нет doCreate - не понадобится.
карма: 26

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#81: 2015-01-15 15:34:36 ЛС | профиль | цитата
Так, давайте тогда последний код, с учетом наличия свойства ManualReset
------------ Дoбавленo в 15.34:
Netspirit писал(а):
Нет doCreate - не понадобится.

Я уже понял, когда написал пост, вот поэтому его и стер
карма: 22

0
Ответов: 4631
Рейтинг: 749
#82: 2015-01-15 15:43:43 ЛС | профиль | цитата
Вроде так events mod 2.7z
[offtop]PS: Galkov-а в авторы дописать.[/offtop]
карма: 26

0
Ответов: 9906
Рейтинг: 351
#83: 2015-01-15 15:57:13 ЛС | профиль | цитата
Блин, за вами не поспеешь

------------ Дoбавленo в 15.53:
Netspirit, ты неправильно понял фишку.
#pas
FEvent := CreateEvent(nil, Value, False, PChar(_prop_Name));
- не совсем то, чего мы хотели.
Смотри, как работает Pchar(string): эта собака (дельфи, в смысле) проверяет полученный указатель на ноль.
Если ненулевой - тупо его и возвращает. Если нулевой - возвращает свой внутренний константный адрес, по которому записан нулевой байт (один).
Спрашивается - оно нам надо...
Поверь мне на слово - я лично все это смотрел "по байтикам"

Правильно так:
#pas
FEvent := CreateEvent(nil, Value, False, @_prop_Name);

------------ Дoбавленo в 15.57:
Вы как хотите, а я домой пошел
карма: 9

0
файлы: 1eventsex.rar [953B] [272]
Ответов: 4631
Рейтинг: 749
#84: 2015-01-15 16:12:50 ЛС | профиль | цитата
Я вообще-то исхожу из соображения, что @string <> @string[1]. Винде требуется второй случай.
Galkov писал(а):
подставляет свой внутренний константный адрес
А что тогда Delphi делает в случае @string?

Я так подозреваю, там должно быть одинаковое поведение: есть переменная/аргумент типа string, значит он уже инициализирован как
<len><counter>#0

И что PChar(string), что @string[1] возвращают указатель на #0, тогда как @string возвращает указатель на <len>. Нет?

Ща в Olly погоняю...
------------ Дoбавленo в 16.12:
Действительно, смысл есть. Ок, пусть будет @_prop_Name.
карма: 26

0
Ответов: 9906
Рейтинг: 351
#85: 2015-01-15 17:08:36 ЛС | профиль | цитата
Netspirit писал(а):

Я так подозреваю, там должно быть одинаковое поведение: есть переменная/аргумент типа string, значит он уже инициализирован как
<len><counter>#0

это не совсем так.
Переменная типа string - это 32-х битный указатель именно на текст. По смещению -4 лежит Length (длина текста), а по смещению -8 лежит RefCount (счетчик ссылок).
Если мне не изменяет мой склероз.
Да, Дельфи гарантирует терминальный нулик.
НО нулевой длины не бывает - в таком случае динамическая память под строку высвобождается, а указатель (тот самый string) становится нулевым.
И что занимательно - именно это нам и надо.
И именно по этой причине, вышеупомянутый Pchar занимается проверочками - он честно гарантирует ненулевой указатель.

То есть, нам надо, просто имеющийся уже у нас указатель - подставить в аргумент winApi.
Спрашивается, зачем нам вызов какой-то функции из модуля System... Да и еще если предварительно длину проверять (что тоже: сначала проверит указатель, и, если уж он ненулевой, то вернет поле Length, а иначе - ноль).
Полный же бред получается
Типа: "Масло бутербродное. Что в переводе означает - масло для хлеба с маслом!"

В принципе, мне даже проверять не хочется, может оно и так заработает. Это все просто беседа больше для понимания - чего там происходит на самом деле.
Так вот: для @string - не происходит НИЧЕГО. И это есть хорошо
------------ Дoбавленo в 17.08:
Кстати, код то я выложил, но я его не проверял. ВААБЩЕ.
И все равно не поспел!
Так что не судите строго, если чего
карма: 9

0
Ответов: 4631
Рейтинг: 749
#86: 2015-01-15 17:21:21 ЛС | профиль | цитата
Для интереса, вот что там происходит:
В верхней картинке в серой строке идёт вызов функции, проверяющей на пустоту, как Galkov и говорил.

Galkov писал(а):
а указатель (тот самый string) становится нулевым
А вот в нижней картинке видно, что не совсем нулевым - там выполняется команда LEA, которая возвращает некий адрес. Я посмотрел по тому адресу - там нули. То-есть это работает корректно, но смахивает на адрес неинициализированной переменной, а это чревато (точнее, свойство _prop_Name у нас инициализировано, пустой строкой). Другими словами, в CreateEvent передаётся не nil. Но на несколько инструкций оптимальней.
карма: 26

0
Ответов: 9906
Рейтинг: 351
#87: 2015-01-15 18:58:03 ЛС | профиль | цитата
Netspirit писал(а):
там выполняется команда LEA, которая возвращает некий адрес

Точно - фигня какая-то
Нужен MOV, а не LEA
Щаз...


------------ Дoбавленo в 18.28:
Netspirit писал(а):
Другими словами, в CreateEvent передаётся не nil. Но на несколько инструкций оптимальней.

1) Это мы поправим (кажется надо @_prop_Name[1] - проверю щаз). Будет MOV
2) Вызов подпрограммы (там тоже команд пять, наверное) - это вам не баб щупать. Это сброс конвейера дважды
Если не считать того, что MSDN, вроде бы, просит NULL... а Pchar как раз гарантирует обратное.


------------ Дoбавленo в 18.58:
Все понял. Надо вот так:
#pas
FEvent := CreateEvent(nil, Value, False, pointer(_prop_Name));
Вроде все очевидно, чего это я так затупил

И тогда будет так:
.0040C5C8: 53                           push        ebx
.0040C5C9: 56 push esi
.0040C5CA: 8BDA mov ebx,edx
.0040C5CC: 8BF0 mov esi,eax
.0040C5CE: 8B4604 mov eax,[esi][04]
.0040C5D1: 85C0 test eax,eax
.0040C5D3: 7406 je .00040C5DB
.0040C5D5: 50 push eax
.0040C5D6: E81981FFFF call CloseHandle ;kernel32
.0040C5DB: 8B4614 mov eax,[esi][14]
.0040C5DE: 50 push eax
.0040C5DF: 6A00 push 000
.0040C5E1: F6DB neg bl
.0040C5E3: 1BC0 sbb eax,eax
.0040C5E5: 50 push eax
.0040C5E6: 6A00 push 000
.0040C5E8: E80F81FFFF call CreateEventA ;kernel32
.0040C5ED: 894604 mov [esi][04],eax
.0040C5F0: 5E pop esi
.0040C5F1: 5B pop ebx
.0040C5F2: C3 retn
(пардон, у мине другой инстрУмент)
карма: 9

0
Ответов: 964
Рейтинг: 12
#88: 2015-01-16 18:52:10 ЛС | профиль | цитата
Совершенно левая мысль что происходи с памятью в DLL?
То есть что будет если ШТАТНО выделить память обратившись к DLL из одного процесса а прочитать из другого ?
(Заранее извиняюсь если идея явный бред пришла только, что в виде офонаризма )

карма: 0

0
Ответов: 9906
Рейтинг: 351
#89: 2015-01-16 19:11:16 ЛС | профиль | цитата
AlexKir писал(а):
Совершенно левая мысль что происходит с памятью в DLL?
Она выделяется и освобождается.
И ей пользуются.
И больше ее от этого не становится.

AlexKir писал(а):
То есть что будет если ШТАТНО выделить память обратившись к DLL из одного процесса а прочитать из другого ?
Если только читать и писать - ничего страшного не будет
А удалять должен тот, кто выделил.

------------ Дoбавленo в 19.11:
У меня тоже совершенно левая мысль возникла...
А самому освоить некоторые ФУНДАМЕНТАЛЬНЫЕ вещи - религия не позволяет, что ли
карма: 9

0
Ответов: 964
Рейтинг: 12
#90: 2015-01-16 19:33:26 ЛС | профиль | цитата

Разумеется я стараюсь сам разбираться .... Однако, тут если знаешь то ответить не проблема .(Сам именно так стараюсь действовать )
И у меня в сетевой оси хайасм и лазарус разве что посмотреть на схемы формы код годятся .
---------------------------------------
Зы[flood]
Да...Глубокомысленные заявления штука сильная особенно для доморощенных псевдо интеллигентов вроде меня .... Сразу начинаешь гадать а что-же имелось собственно ввиду . Но мой уже вроде немалый опыт "интернето плаванья" подсасывает что часто это просто пустая фигура речи ...

Уважаемый Галков я действительно именно такой каким показываюсь объективно неплохая сообразительность у меня часто соседствует с махровой глупостью .. В чем по счастью в чем обычно хватает ума и воспитания честно признаться Но поскольку других мозгов у меня нет использую те что имеются [/flood]
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)