Конференция "Начинающим" » Кто виноват и что делать
 
  • Dimka Maslov © (27.02.17 21:24) [0]
    Есть программа, написанная на Delphi XE8. Ничего особенного - графическая оболочка с использованием TActionToolBar и TActionMainMenuBar. Оболочка запускает вычислительный поток и время от времени общается с ним при помощи PostMessage/SendMessage, синхронизируется с ним через PulseEvent, WaitForSingle object и проч.

    Есть маленькая особенность - программа запускается на виртуальной машине, доступ к которой осуществляется через WMware Horizon Client. Пока идёт работа и клиент соединён с физической машиной всё работает прекрасно. Ну разве что тулбар время от времени вдруг "сворачивается" - все иконки в одну и висит пару секунд, то вдруг тема сменяется на тему по умолчанию. Это не страшно. А страшно другое - если от клиента отсоединиться (т.е. он продолжает свою работу), подождать какое-то время (час скажем), а потом приконнектится опять, что это самое написанное приложение на Delphi зависает вусмерть. Вообще. Хотя другие приложения прекрасно работают.
    Что это может быть?
  • Игорь Шевченко © (27.02.17 22:06) [1]
    Я бы запустил Process Explorer и посмотрел, чего ждут потоки зависшего приложения.
  • Dimka Maslov © (27.02.17 22:26) [2]
    Расчётный поток нормально работает (пишется лог), а вот оболочка вешается. И думается именно из-за новой фичи "периодическое сворачивание TActionToolBar".
  • NoUser © (27.02.17 23:44) [3]
    http://www.transl-gunsmoker.ru/2010/02/pulseevent.html

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms684914(v=vs.85).aspx

    > Note  This function is unreliable and should not be used.
    >  It exists mainly for backward compatibility.
    >
  • Dimka Maslov © (28.02.17 09:32) [4]

    > This function is unreliable


    Any function is unreliable and should not be used. Но в данном случае, PulseEvent используется для работы кнопок "Pause" и "Resume". А это значит, что когда соединения клиентской машины с виртуальной нет, то и нажать на кнопку некому.
  • Владислав © (07.03.17 16:23) [5]
    Dimka Maslov ©   (28.02.17 09:32) [4]

    Дело в том, что поток, может пропустить PulseEvent, а потом до посинения его ожидать.
  • Dimka Maslov © (07.03.17 21:22) [6]

    > Владислав ©   (07.03.17 16:23) [5]


    Но дело в том, что поток, который может пропустить PulseEvent,  а потом до посинения его ожидать нормально себе работает, а вот основной поток приложения - виснет.
  • Владислав © (07.03.17 22:22) [7]
    Dimka Maslov ©   (07.03.17 21:22) [6]

    Тогда Вам там виднее. Код Вы не приводите, а по предоставленной информации Вам в [3] указали потенциальную проблему, которая может привести к некорректной работе многопоточного приложения вплоть до зависания.
    До кучи, еще нам не известно, что у Вас там с SendMessage происходит.

    В общем, с такой солянкой deadlock можно словить, казалось бы, на пустом месте.
  • Владислав © (07.03.17 22:37) [8]
    Если алгоритм взаимодействия между потоками не слишком сложный, то можно попробовать нарисовать схему, на которой будут присутствовать все механизмы синхронизации, и поискать "узкое место".
    На мой взгляд, лучше пересмотреть синхронизацию между потоками, иначе поддерживать программу сложно будет.
  • Dimka Maslov © (08.03.17 18:59) [9]
    Но как тогда подвисание в разлогиненой виртуальной машине объясняется в том случае, если поток только один - основной (т.е. расчёт не запущен)? Тогда как при залогиненном пользователе программа работает часами и не виснет? Дело явно не в синхронизации.
 
Конференция "Начинающим" » Кто виноват и что делать
Есть новые Нет новых   [118385   +24][b:0][p:0.001]