Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 4698
Рейтинг: 426
#46: 2015-01-14 01:55:36 ЛС | профиль | цитата
nesco, ну... я представил, как будет удобнее хиасмеру - самому разбираться с оффсетами и размерами, или предоставить все компонентам.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#47: 2015-01-14 09:49:38 ЛС | профиль | цитата
Assasin писал(а):
как это сделано и в обычном штатном Memory

В обычном штатном Memory НЕ СДЕЛАН (например) 32-х битный float в формате BigEndian.
А в чужих файлах этого добра - да сколько угодно.

И при всем этом, у нас "это уже есть"
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#48: 2015-01-14 11:08:47 ЛС | профиль | цитата
Насколько я понял Assasin-а, то он предлагает типизировать данные ввода/вывода, че-то мне подсказывает, что по типу StreamPack/StreamUnPack, только для одного аргумента, на уровне компонента и для всех типов данных.

Galkov, че-то мне кажется, что в этом компоненте не хватает события изменения данных. Получается, что дав нам проекцию, компонент дальше на нас плевал, че мы пишем или читаем из этой проекции ему по барабану. Одно дело , если работаем с файлами, в пределах одного приложения, а вот если работаем в межпроцессном взаимодействии, то другое приложение никак не узнает, когда первое ему что-то послало.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#49: 2015-01-14 11:42:05 ЛС | профиль | цитата
Да, не узнает.
Первое, что мне приходит на ум - не надо быть святее папы римского.
Для этого в системе (да и у нас, впрочем) есть всякие там Event-ы. Для того кто захочет обменяться сигналами (типа: "читай, собака") - такая возможность есть.

Хотя, являясь объектом ядра (как и Event), он должен БЫ иметь свое сигнальное состояние. А вот когда сие происходит, и какая от этого может быть народнохозяйственная польза - НЕ ПОМНЮ... Читать буквари надо...
карма: 9

0
Ответов: 4630
Рейтинг: 749
#50: 2015-01-14 11:59:45 ЛС | профиль | цитата
В качестве предложения: если нужен межпроцессный стрим - можно сделать копию MemoryStream, обозвав её SharedMemStream на основе того же принципа, только без работы с дисковым файлом. В MemoryStream добавить только свойство Name и всё - для пользователя будет по барабану, как оно внутри будет работать. Возможно ещё doOpen, doClose, onError
карма: 26

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#51: 2015-01-14 13:30:54 ЛС | профиль | цитата
Galkov писал(а):
Для этого в системе (да и у нас, впрочем) есть всякие там Event-ы

А пример можно, как использовать компонент Event в межпроцессном взаимодействии. Можно на готовом примере из справки по SharedStream.
------------ Дoбавленo в 13.30:
Netspirit писал(а):
В качестве предложения: если нужен межпроцессный стрим

Меня сейчас больше всего волнует -- как это все безобразие засинхронизировать Че-то я не догоняю пока, а использовать таймер и читать по нему весь стрим целиком, или по кнопке читать, получив сообщение типа -- Васька, я тебе данные послал, можешь смотреть -- это не дело.
карма: 22

0
Ответов: 4630
Рейтинг: 749
#52: 2015-01-14 14:41:14 ЛС | профиль | цитата
Используешь Events для сигнализации чего-либо, WaitObject - для ожидания смены состояния Events (в коде - CreateEvent, циклично или по таймеру WaitForSingleObject).
карма: 26

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#53: 2015-01-14 14:45:12 ЛС | профиль | цитата
Netspirit писал(а):
Используешь Events для сигнализации чего-либо, WaitObject - для ожидания смены состояния Events (в коде - CreateEvent, циклично или по таймеру WaitForSingleObject)

Ты можешь пример дать, как это организовать с помощью наших компонентов в двух экземплярах приложения.
карма: 22

0
Ответов: 4630
Рейтинг: 749
#54: 2015-01-14 14:55:08 ЛС | профиль | цитата
Схема 1: code_34913.txt

Схема 2: code_34914.txt

1) Запускаешь схему 1, потом 2
2) В схеме 2 жмешь "Ожидать"
3) В схеме 1 жмешь "Сигнализировать"
карма: 26

0
файлы: 2code_34913.txt [432B] [363], code_34914.txt [917B] [369]
Разработчик
Ответов: 26163
Рейтинг: 2127
#55: 2015-01-14 15:35:37 ЛС | профиль | цитата
Netspirit, спасибо, частично понятно. А как сделать такое одной схемой, но разными копиями приложения
карма: 22

0
Ответов: 4630
Рейтинг: 749
#56: 2015-01-14 15:45:09 ЛС | профиль | цитата
Так WaitObject на тот самый Events (либо другой с тем же именем)...
карма: 26

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#57: 2015-01-14 15:56:06 ЛС | профиль | цитата
Netspirit писал(а):
Так WaitObject на тот самый Events (либо другой с тем же именем)...

Пробовал, виснут начисто обе копии программы
карма: 22

0
Ответов: 4630
Рейтинг: 749
#58: 2015-01-14 16:14:30 ЛС | профиль | цитата
Естественно, виснут. А как нужно?

Предполагаю, нужно в параллельном потоке поставить цикл, в цикле делать doWaitObject с таймаутом, скажем, 1 сек. Вот только в описании onWait сказано, что выдаёт код возврата, а в коде - ничего не выдаёт. По коду возврата - если ожидание успешно/ошибка - прервать цикл, событие наступило. Если код TIMEOUT - продолжить исполнение. Вместо кода можно просто добавить событие onTimeout.

Можно без цикла, с бесконечным ожиданием. Тогда поток придётся убивать только по doStop.

карма: 26

0
Ответов: 9906
Рейтинг: 351
#59: 2015-01-15 09:27:45 ЛС | профиль | цитата
Ну например...
Если уж непременно "одна копия"
Add(MainForm,12086188,385,112)
{
Position=1
link(onCreate,8704945:doEvent1,[])
}
Add(Events,9649812,574,126)
{
Name="MyCoolEvent"
AddHint(-30,-25,78,13,Name)
}
Add(WaitObject,9175818,574,175)
{
link(ObjHandle,9649812:ObjHandle,[])
AddHint(2,40,24,13,Time)
}
Add(Thread,13945738,518,175)
{
Delay=0
link(onExec,9175818:doWait,[])
link(onSyncExec,11144088:doData,[])
}
Add(Hub,8704945,448,126)
{
link(onEvent1,9649812:doCreate,[])
link(onEvent2,14910826:doWork1,[(487,139)])
}
Add(Button,9022058,385,266)
{
Left=100
Top=40
Width=180
Height=40
Align=2
Caption="Просигнализирвать!"
link(onClick,11297637:doEvent1,[])
}
Add(Hub,11297637,448,266)
{
OutCount=4
link(onEvent1,13945738:doStop,[(480,272)(480,188)])
link(onEvent2,9649812:doSet,[(494,279)(494,139)])
link(onEvent3,9649812:doReset,[(501,286)(501,146)])
link(onEvent4,14910826:doWork3,[(487,293)])
}
Add(ListBox,5200896,693,182)
{
Left=920
Top=115
Align=5
}
Add(DoData,11144088,630,182)
{
Data=String(++Событие получено)
link(onEventData,5200896:doAdd,[])
}
Add(HubEx,14910826,483,175)
{
link(onEvent,13945738:doStart,[])
}

------------ Дoбавленo в 08.36:
Netspirit писал(а):
что выдаёт код возврата, а в коде - ничего не выдаёт.

Безобразие

------------ Дoбавленo в 09.27:
Между нами девочками говоря...
Сигнал получают ВСЕ копии программки.
А вот ЕСЛИ завести св-во ManualReset (второй аргумент в CreateEvent), то при значении False -- сигнал будет получать только одна копия
И, в вышеприведенной схеме - связь на doReset становится лишней.
nesco, чего скажешь про "завести св-во ManualReset"
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#60: 2015-01-15 09:41:43 ЛС | профиль | цитата
Galkov писал(а):
Сигнал получают ВСЕ копии программки

Ага, понятно. Но остался один ламерский вопрос -- а почему оно сейчас не ловит событие в приложении, из которого послано
Galkov писал(а):
чего скажешь про "завести св-во ManualReset"

Я не против, давай реализацию.
карма: 22

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