Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

Открыть новую тему     Написать ответ в эту тему

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
         
Обсуждаем новые возможности и баги
 
Просьба писать про Embarcadero RAD Studio XE5, XE6, XE7, XE8, 10.x (Seattle, Berlin,Tokyo)
  По вопросам скачивания - Тема в Варезнике (lite-версии тут)
  Вопросы по неюникодным версиям Delphi — шестая бумага
  Бесплатные Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus
  Коммерческие компоненты и утилиты для Delphi/BCB
  Вопросы по компонентам для Delphi, C++ Builder разных версий
  Новые языковые возможности, начиная с Delphi 2005 по XE4 — здесь, и New!здесь еще
  Англоязычный официальный форум Embarcadero — здесь
  Embarcadero Quality Central, веб интерфейс — здесь, новый Quality Portal тут
  Программирование на Delphi — викиверситет
  Другие ресурсы
   Предыдущие бумаги
 
     Вопросы ..XE4       Вопросы ..XE3    Вопросы ..XE2      
  Вопросы ..2009-XE    Вопросы ..<2009 / ч.5    Вопросы ..<2009 / ч.4      
  Вопросы ..<2009 / ч.3    Вопросы ..Delphi 2 / ч.2    Вопросы ..Delphi  

  Выключение встроенного эксперта Castalia  для XE8 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 945 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: virussnu, 01:29 27-10-2018
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
System.TMonitor  

Только заметно медленее, как оказалось

Всего записей: 737 | Зарегистр. 18-05-2009 | Отправлено: 13:16 07-08-2015
Sulphide

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я пробовал критические секции... не помогает, ID потока один и тот же, то есть потоки не разные, поэтому и странно. Там внутри компонента скорее всего чего-то намужено Такое ощущение что поток с ID 1 скажем на половине рисования останавливается и начинает обрабатку ивентов от кнопок и продолжает дальше "рисовать"... Хотя вообще надо бы проверить, может рисование проскакивает в другом потоке переодически (не основном потоке приложения), тогда это баг компонента.
 
ps ДА! Похоже, что это баг компонента, потому что в старых версиях такого не было... Все ивенты компонента типа OnFileOpen, OnState, OnPosition идут с ID потока приложения, кроме ивентов рисования. У компонента есть что-то типа TriggerEventInMainThread := false/true я без задних мыслей делаю true и ожидаю что все ивенты будут в системном потоке.. а не тут то было. GetCurrentThreadId() <> System.MainThreadID

Всего записей: 190 | Зарегистр. 20-03-2008 | Отправлено: 17:42 07-08-2015 | Исправлено: Sulphide, 18:12 07-08-2015
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sulphide
Так поставте бряк в обработчике кнопок и посмотрите стек вызовов. Чего гадать то? Чтоб точно попасть на нужный стек, можно бряк сделать зависимым от ImageReady.

Всего записей: 2256 | Зарегистр. 24-05-2007 | Отправлено: 17:55 07-08-2015 | Исправлено: Frodo_Torbins, 17:57 07-08-2015
UniSoft



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

а исходников компонента нету что-ли?
я вот по этой причине всегда избегаю, компоненты без исходников...

Всего записей: 560 | Зарегистр. 22-12-2006 | Отправлено: 19:57 07-08-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть задача. 1-й процесс пишет в текстовый файл, 2-ой процесс должен читать данные из этого файла, желательно только изменения.
По таймеру каждый раз перечитывать данный файл не хочу, т. к. изменения в файле нужно получать с минимальными задержками. Есть ли какие-то другие решения?

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 11:19 08-08-2015 | Исправлено: SuPriTo, 11:20 08-08-2015
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuPriTo
 

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

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

----------
Кекс. Антибиотики. Ламбада.

Всего записей: 1545 | Зарегистр. 13-10-2005 | Отправлено: 11:37 08-08-2015
vez



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 482 | Зарегистр. 02-06-2003 | Отправлено: 11:50 08-08-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

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

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

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

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

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 12:34 08-08-2015
UniSoft



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

мониторить размер файла и дату/время изменения,
можно в отдельном потоке.
А если, 1-й процесс вы сами проектируете, то можно задействовать TEvent (к примеру именованный).

Всего записей: 560 | Зарегистр. 22-12-2006 | Отправлено: 13:18 08-08-2015
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuPriTo

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

Мониторинг изменений в директориях и файлах средствами Delphi. Часть #2.

----------
Кекс. Антибиотики. Ламбада.

Всего записей: 1545 | Зарегистр. 13-10-2005 | Отправлено: 13:22 08-08-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man
Да я так решил делать. Но хотелось бы тоже самое, но только с файлом.  
Типа функции ReadDirectoryChangesW, только которая бы возвращала изменения в конкретном файле.

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 13:37 08-08-2015
vez



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 482 | Зарегистр. 02-06-2003 | Отправлено: 15:26 08-08-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 15:35 08-08-2015 | Исправлено: SuPriTo, 10:08 09-08-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuPriTo

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

 
Наверное Вы что-то не так делаете... У меня ReadDirectoryChanges отлично работает с сетевой шарой. Использовал в программе для мониторинга почтового сервера MDaemon. Шара задана в виде "\\server\c$\MDaemon\Users\", функцию ReadDirectoryChanges вызывал с параметрами FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_LAST_WRITE

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 10:55 09-08-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
idiMAN
Делаю такой путь \\vmware-host\Shared Folders\Projects - не работает. Может быть из-за виртуалки VMWare.

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 11:08 09-08-2015
vez



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Я тоже испытывал с сетевой, работало

Всего записей: 482 | Зарегистр. 02-06-2003 | Отправлено: 11:43 09-08-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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 );
 

 
P.S. Всё это крутится в отдельном потоке, который завершается из основного с помощью
Код:
SetEvent( hStopHandle );

В основном потоке ранее создан hStopHandle

Код:
hStopHandle := CreateEvent( nil, True, False, nil );


Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 12:34 09-08-2015 | Исправлено: idiMAN, 12:38 09-08-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
idiMAN
Вот все так и делаю. Возможно, что у вас домен и активдиректори, а у меня рабочая группа. Поэтому вот и не работает эта функция. Но нужно тестировать.

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 14:15 09-08-2015
dred2k



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
idiMAN
Ошибки кто проверять будет ?
Цитата:
hDir := CreateFile(...

Код:
hDir := CreateFile(...);
if(hDir = INVALID_HANDLE_VALUE) then
  RaiseLastOSError;
И во всех подобных местах тоже.
 
SuPriTo
Проверишь возвраты - узнаешь в чем проблема.

Всего записей: 403 | Зарегистр. 15-02-2006 | Отправлено: 15:23 09-08-2015 | Исправлено: dred2k, 15:24 09-08-2015
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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.

Всего записей: 1350 | Зарегистр. 24-03-2009 | Отправлено: 15:48 09-08-2015 | Исправлено: SuPriTo, 16:03 09-08-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru