В Delphi действительно ли OutputDebugString ориентирован на многопотоковое исполнение?

UNION ALL по всем таблицам дает вам основу (и вам следует подумать о том, чтобы изменить схему и просто использовать только одну такую ​​таблицу с самого начала).

Для баланса вы можете использовать подзапрос, который получает сумму «предыдущих» сумм. «Предыдущий» здесь означает бронирование с датой, меньшей или равной дате текущего бронирования. Поскольку в один день может быть больше бронирований, нам нужен второй критерий, чтобы отделить их друг от друга. Вот тут sno вступает в игру - оно также должно быть меньше или равно текущему. Чтобы убедиться, что sno уникален во всем наборе, а не только в той таблице, из которой он получен, мы добавляем уникальный идентификатор таблицы.

В MySQL 8.0 для этого можно использовать оконную сумму, что значительно упрощает ее. Но я предполагаю, что вы находитесь на меньшей версии.

SELECT x.amnt,
       x.dat,
       (SELECT coalesce(sum(amnt), 0)
               FROM (SELECT concat('c1-', sno) sno
                            amnt,
                            dat
                            FROM credittable1
                            WHERE uid = 1
                     UNION ALL
                     SELECT concat('c3-', sno) sno,
                            amnt,
                            dat
                            FROM credittable2
                            WHERE uid = 1
                     UNION ALL
                     SELECT concat('c3-', sno) sno,
                            amnt,
                            dat
                            FROM credittable3
                            WHERE uid = 1
                     UNION ALL
                     SELECT concat('d1-', sno) sno,
                            -1 * amnt,
                            dat
                            FROM debittable
                            WHERE uid = 1) y
               WHERE y.dat <= x.dat
                     AND y.sno <= x.sno) bal
       FROM (SELECT concat('c1-', sno) sno,
                    amnt,
                    dat
                    FROM credittable1
                    WHERE uid = 1
             UNION ALL
             SELECT concat('c2-', sno) sno,
                    amnt,
                    dat
                    FROM credittable2
                    WHERE uid = 1
             UNION ALL
             SELECT concat('c3-', sno) sno,
                    amnt,
                    dat
                    FROM credittable3
                    WHERE uid = 1
             UNION ALL
             SELECT concat('d1-', sno) sno,
                    -1 * amnt,
                    dat
                    FROM debittable
                    WHERE uid = 1) x
       ORDER BY x.dat;
16
задан Peter Mortensen 2 December 2017 в 22:49
поделиться

3 ответа

Не волнуйтесь, это.

, Когда OutputDebugString () называет приложение, он делает эти шаги. Обратите внимание, что отказ в любой точке отказывается от всего этого и рассматривает запрос отладки как не (строка не отправляется никуда).

  1. Открывают DBWinMutex и ожидают, пока у нас нет эксклюзивного доступа к нему.
  2. Карта сегмент DBWIN_BUFFER в память: если это не найдено, нет никакого отладчика, работающего, таким образом, весь запрос проигнорирован.
  3. Открывают события DBWIN_BUFFER_READY и DBWIN_DATA_READY. Как с сегментом общей памяти, пропуская объекты означают, что никакой отладчик не доступен.
  4. Ожидают события DBWIN_BUFFER_READY, которое будет сообщено: это говорит, что буфер памяти больше не используется. Большую часть времени это событие будет сообщено сразу, когда оно будет исследовано, но оно не будет ожидать дольше, чем 10 секунд буфера для становления готовым (тайм-аут отказывается от запроса).
  5. Копия приблизительно до 4 кбайт данных к буферу памяти и хранилище идентификатор текущего процесса там также. Всегда помещайте байт NUL в конце строки.
  6. Говорят отладчику, что буфер готов путем установки события DBWIN_DATA_READY. Отладчик берет его оттуда.
  7. Выпуск взаимное исключение
  8. Близко объекты События и Раздела, хотя мы сохраняем дескриптор к взаимному исключению вокруг на потом.
18
ответ дан 30 November 2019 в 15:52
поделиться

Ну, не, что это не верно, это, но именно так что Вы не должны просто брать слово Lieven для него:

Передача данных между приложением и отладчиком сделана через 4-килобайтовый блок общей памяти со Взаимным исключением и двумя Объектами-событиями, защищающими доступ к нему. Это эти четыре включенные объекта ядра.

Win32 OutputDebugString Понимания является превосходной статьей о вопросе.

26
ответ дан 30 November 2019 в 15:52
поделиться

Я испытал затруднения однажды, тем не менее, из-за строк в DLL ISAPI. По некоторой нечетной причине не была установлена булевская переменная IsMultiThread, определенная в System.pas!

Это вызывало странный AccessViolations, когда-то поток выполнял больше чем один поток... Простой "IsMultiThread: = верный"; в единице инициализация зафиксировала его.

3
ответ дан 30 November 2019 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: