Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE5-XE8,10.x(Seattle, Berl

Автор: Frodo_Torbins
Дата сообщения: 05.08.2015 17:52

Цитата:
А в первом случае ивент рисования тупо прерывается ивентом от клавиатуры.

Это что то новенькое. По крайней мере я не знаю способа прервать, из того же потока, работающий обработчик, если в нем нет обработки очереди сообщений (типа Application.ProcessMessages).
Автор: ZloyBrawler
Дата сообщения: 05.08.2015 21:14
Sulphide
Ностальгия посетила так сказать))) и сразу видно что с Русским языком тогда не сильно дружил "лабЕринт")) да и ща малость тоже))
http://imageshost.ru/photo/3748
http://imageshost.ru/photo/3749
http://imageshost.ru/photo/3750
http://imageshost.ru/photo/3751
Автор: Sulphide
Дата сообщения: 05.08.2015 21:41

Цитата:
Это что то новенькое. По крайней мере я не знаю способа прервать, из того же потока, работающий обработчик, если в нем нет обработки очереди сообщений (типа Application.ProcessMessages).

Да я вот тоже думал, что так и есть. Банально в начале отрисовки сделал скажем ImageReady := false, в конце ImageReady := true в итоге в части клавиатурных ивентов оказывается, что ImageReady все же false...
ZloyBrawler Круто!)
Автор: Frodo_Torbins
Дата сообщения: 05.08.2015 23:55
Sulphide
В таких случаях на стек вызовов смотреть надо. Наверняка где то в коде, который вы вызываете, есть обработка сообщений или каких-нибудь очередей.
Автор: Sulphide
Дата сообщения: 07.08.2015 05:45
Спасибо, решил все как раз проверкой ImageReady на false, просто при обработке клавиш и кнопок на форме отключаю ивент рисования, потом проверяю готова ли картинка и если не готова то делаю sleep(20), учитывая что у меня в среднем самый жирный кадр рисуется менее 10мс, в среднем видео 4k 3-7мс, то этого хватает, чтобы ивент рисования завершился, до того как мне надо будет производить мои действия, потом заново включаю ивент рисования компонента хотя не понимаю как ивент рисования, работающий в том же потоке, что и остальные ивенты может продолжаться?! Возможно, конечно, это происки wglDeleteContext или wglMakeCurrent :\ которые используются в рисовании и обработке клавиш...
Автор: UniSoft
Дата сообщения: 07.08.2015 11:50

Цитата:
***.onpaintevent, когда очередной кадр готов, который в свою очередь в событии ***.onpaintevent обрабатываю я. Так вот, нажатия клавиш в OnFormKeyUp и других приводят к тому, что клавишное событие может приключиться именно посередине ***.onpaintevent, то есть во время рисования. А мне в клавишных событиях надо открывать очередной файл, либо делать вещи опять таки связанные с рисованием... Как тут быть? Как можно дождаться окончания ***.onpaintevent в любом другом событии, чтобы продолжить работу?

может просто обернуть все функции, которые не должны пересекаться в TCriticalSection?
тогда один поток просто приостановится, пока другой не освободит секцию.
(по крайней мере это лучше (и правильнее), чем sleep(20))


Цитата:
учитывая что у меня в среднем самый жирный кадр рисуется менее 10мс, в среднем видео 4k 3-7мс, то этого хватает, чтобы ивент рисования завершился

А на каком-нибудь ПК древнем, как мамонт, эти 10мс могут несколькоооооооооо затянуться...


Код:
TMyClass = class
private
FCs: TCriticalSection;
//...
end;

constructor TMyClass.Create;
begin
inherited;
FCs := TCriticalSection.Create;
end;

destructor TMyClass.Destroy;
begin
FCs.Free;
inherited;
end;

// ну и обернуть функции в

FCs.Acquire; { lock out other threads }
try
// do job
finally
FCs.Release;
end;
Автор: Eternal_Shield
Дата сообщения: 07.08.2015 13:16

Цитата:
System.TMonitor

Только заметно медленее, как оказалось
Автор: Sulphide
Дата сообщения: 07.08.2015 17:42
Я пробовал критические секции... не помогает, ID потока один и тот же, то есть потоки не разные, поэтому и странно. Там внутри компонента скорее всего чего-то намужено Такое ощущение что поток с ID 1 скажем на половине рисования останавливается и начинает обрабатку ивентов от кнопок и продолжает дальше "рисовать"... Хотя вообще надо бы проверить, может рисование проскакивает в другом потоке переодически (не основном потоке приложения), тогда это баг компонента.

ps ДА! Похоже, что это баг компонента, потому что в старых версиях такого не было... Все ивенты компонента типа OnFileOpen, OnState, OnPosition идут с ID потока приложения, кроме ивентов рисования. У компонента есть что-то типа TriggerEventInMainThread := false/true я без задних мыслей делаю true и ожидаю что все ивенты будут в системном потоке.. а не тут то было. GetCurrentThreadId() <> System.MainThreadID
Автор: Frodo_Torbins
Дата сообщения: 07.08.2015 17:55
Sulphide
Так поставте бряк в обработчике кнопок и посмотрите стек вызовов. Чего гадать то? Чтоб точно попасть на нужный стек, можно бряк сделать зависимым от ImageReady.
Автор: UniSoft
Дата сообщения: 07.08.2015 19:57

Цитата:
компонента скорее всего чего-то намужено

а исходников компонента нету что-ли?
я вот по этой причине всегда избегаю, компоненты без исходников...
Автор: SuPriTo
Дата сообщения: 08.08.2015 11:19
Есть задача. 1-й процесс пишет в текстовый файл, 2-ой процесс должен читать данные из этого файла, желательно только изменения.
По таймеру каждый раз перечитывать данный файл не хочу, т. к. изменения в файле нужно получать с минимальными задержками. Есть ли какие-то другие решения?
Автор: data man
Дата сообщения: 08.08.2015 11:37
SuPriTo


Цитата:
Есть ли какие-то другие решения?

1 Мониторьте размер файла во втором процессе и запоминайте его.
2 При увеличении размера файла считывайте с предыдущей запомненной позиции до конца файла.
3 goto 1

Как то так.
Автор: vez
Дата сообщения: 08.08.2015 11:50

Цитата:
Есть ли какие-то другие решения

Есть, недавно использовал с успехом

ReadDirectoryChanges......
Автор: SuPriTo
Дата сообщения: 08.08.2015 12:34
data man

Цитата:
1 Мониторьте размер файла во втором процессе и запоминайте его.

Вопрос в том, как это делать?
vez

Цитата:
ReadDirectoryChanges......

Пока склоняюсь к этому методу. Вот бы что-то для файла похожее, но пока не нашел

Автор: UniSoft
Дата сообщения: 08.08.2015 13:18

Цитата:
Есть ли какие-то другие решения?

мониторить размер файла и дату/время изменения,
можно в отдельном потоке.
А если, 1-й процесс вы сами проектируете, то можно задействовать TEvent (к примеру именованный).
Автор: data man
Дата сообщения: 08.08.2015 13:22
SuPriTo

Цитата:
Вопрос в том, как это делать?

Мониторинг изменений в директориях и файлах средствами Delphi. Часть #2.
Автор: SuPriTo
Дата сообщения: 08.08.2015 13:37
data man
Да я так решил делать. Но хотелось бы тоже самое, но только с файлом.
Типа функции ReadDirectoryChangesW, только которая бы возвращала изменения в конкретном файле.
Автор: vez
Дата сообщения: 08.08.2015 15:26

Цитата:
ипа функции ReadDirectoryChangesW, только которая бы возвращала изменения

Она ловит все изменения, только как применить надо порыть интернет
Автор: SuPriTo
Дата сообщения: 08.08.2015 15:35

Цитата:
Она ловит все изменения, только как применить надо порыть интернет

Да кончено ловит, только в целом каталоге, сейчас разбираюсь.
Добавлено:
Функция ReadDirectoryChangesW не ловит изменения на сетевых дисках.
А как отловить изменения на сетевых дисках?
Автор: idiMAN
Дата сообщения: 09.08.2015 10:55
SuPriTo

Цитата:
Функция ReadDirectoryChangesW не ловит изменения на сетевых дисках. А как отловить изменения на сетевых дисках?


Наверное Вы что-то не так делаете... У меня ReadDirectoryChanges отлично работает с сетевой шарой. Использовал в программе для мониторинга почтового сервера MDaemon. Шара задана в виде "\\server\c$\MDaemon\Users\", функцию ReadDirectoryChanges вызывал с параметрами FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_LAST_WRITE
Автор: SuPriTo
Дата сообщения: 09.08.2015 11:08
idiMAN
Делаю такой путь \\vmware-host\Shared Folders\Projects - не работает. Может быть из-за виртуалки VMWare.
Автор: vez
Дата сообщения: 09.08.2015 11:43

Цитата:
У меня ReadDirectoryChanges отлично работает с сетевой шарой

Я тоже испытывал с сетевой, работало
Автор: idiMAN
Дата сообщения: 09.08.2015 12:34
SuPriTo
Вот кусок кода на Delphi, я думаю разберётесь...

Код:
const
dwBufferSize = 10000;

var
hDir : THandle;
hDataReady : THandle;
Overlapped : TOverlapped;
HandleArray : array [0..1] of THandle;
bChanged : Boolean;
lpBuf : Pointer;
cbReturn : Cardinal;
WaitResult : Cardinal;

begin
hDir := CreateFile(
PChar('\\server\c$\MDaemon\Users\'),
GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_DELETE,
nil,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS or
FILE_FLAG_OVERLAPPED,
0
);

hDataReady := CreateEvent(nil, False, False, nil);
Overlapped.hEvent := hDataReady;

HandleArray[0] := hDataReady;
HandleArray[1] := hStopHandle;

GetMem(lpBuf, dwBufferSize);
ZeroMemory(lpBuf, dwBufferSize);

repeat
bChanged := ReadDirectoryChanges(
hDir,
lpBuf,
dwBufferSize,
True,
FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_LAST_WRITE,
@cbReturn,
@Overlapped,
nil
);

WaitResult := WaitForMultipleObjects(2, @HandleArray, False, INFINITE);

if WaitResult = WAIT_OBJECT_0
then begin
// Тут обрабатываем сведения о полученных изменениях файловой системы
end;
until WaitResult <> WAIT_OBJECT_0;

if hDataReady <> INVALID_HANDLE_VALUE then CloseHandle( hDataReady );
FreeMem( lpBuf );
if hDir <> INVALID_HANDLE_VALUE then CloseHandle( hDir );
Автор: SuPriTo
Дата сообщения: 09.08.2015 14:15
idiMAN
Вот все так и делаю. Возможно, что у вас домен и активдиректори, а у меня рабочая группа. Поэтому вот и не работает эта функция. Но нужно тестировать.
Автор: dred2k
Дата сообщения: 09.08.2015 15:23
idiMAN
Ошибки кто проверять будет ?
Цитата:
hDir := CreateFile(...

Код: hDir := CreateFile(...);
if(hDir = INVALID_HANDLE_VALUE) then
RaiseLastOSError;
Автор: SuPriTo
Дата сообщения: 09.08.2015 15:48
dred2k
Я ошибки проверяю, как же без этого Иногда даже зная ошибку, не понимаешь в чем проблема.
В общем протестировал.
В виртуалке VMWare при ключенных общих папках, функция ReadDirectoryChanges выдает ошибку "неизвестная функция" (код кажется = 1).
Расшаривал диск на роутере keenetic 2 giga и мониторил каталог. Event активируются, но структуры _FILE_NOTIFY_INFORMATION об изменения приходят некорректными. Размер имени файла (FileNameLength) = 0, действие (Action) = 0 - собственно данные не корректные.
Расшаривал сетевую папку в Windows и потом ее мониторил по сети. Действительно работает. так что idiMAN прав при условии, что каталог расшарен в windows.
Под другими системами работа функции прямо не гарантируется.
Добавлено:
_https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365465%28v=vs.85%29.aspx

В хелпе написано следующее, его все же надо внимательно читать.
If the network redirector or the target file system does not support this operation, the function fails with ERROR_INVALID_FUNCTION.
Автор: dred2k
Дата сообщения: 09.08.2015 19:44
SuPriTo
Поведение общих папок в системах виртуализации схоже - кое-что в госте странным образом не работает, сталкивался. Видимо, все зависит от полноты реализации протокола smb. В случае с роутером можно самбу покрутить-посмотреть.
Автор: reenoip
Дата сообщения: 12.08.2015 13:11

Цитата:
Скомпилил тестовое (TabbedApplication) приложение под HTC One S (андроид 4.1). Собстна все прошло удачно. Но:
1. Время компиляции (AMD X250 3Gz 4Gb RAM) около 8 сек . (при том что такое же app для Win32 компилится за 1 сек.)
2. Деплой (загрузка на устройство) идет еще около 10 сек .
3. Размер получившегося приложения уже в устройстве ~22Мб (понятно что весь RTL/FM)
4. Скорость запуска приложения около 3 сек!
5. Но на первый взгляд все пашет норм!

RuXandr, прошло два года без одного месяца. Есть возможность повторить всё то же самое, чтобы сравнить, есть ли фундаментальные сдвиги в XE(x)?
Автор: silealio
Дата сообщения: 12.08.2015 20:00
Коллеги, есть ли у кого (ссылка на) SQLite врэппер для использования под андроидом?
Подкиньте плиз...
Автор: protoror
Дата сообщения: 13.08.2015 11:02
silealio
пробовали?
http://synopse.info/forum/viewforum.php?id=2

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

Предыдущая тема: Отмена встречи в Outlook из Excel VBA


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.