Проверьте, что процесс все еще выполняется или завершается в окнах [дубликат]

Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.

например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.

public Class myClass
{
   public int prop1 {get;set;}
}

Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref.prop1 = 1;  //This line throws error
     }
}

выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.

Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref = new myClass();
        ref.prop1 = 1;  
     }
}
4
задан Fire Lancer 6 August 2009 в 12:45
поделиться

4 ответа

Вы можете проверить срок службы, используя

bool isProcessRunning(HANDLE process)
{
   return WaitForSingleObject( process, 0 ) == WAIT_TIMEOUT;
}
6
ответ дан decasteljau 31 August 2018 в 09:56
поделиться
  • 1
    Просто нужно добавить чек для INVALID_HANDLE_VALUE, поскольку сообщалось, что процесс был запущен, когда он был даже недействителен :) – Fire Lancer 6 August 2009 в 13:01
  • 2
    API, такие как WaitForSingleObject, никогда не должны возвращать INVALID_HANDLE_VALUE, если у вас есть дескриптор процесса, даже если он завершен. Ручка и основной объект должны оставаться открытыми до тех пор, пока явно не будут закрыты процессами ссылки (или эти процессы не будут завершены). Вы уверены, что не пытаетесь назвать его идентификатором процесса, а не ручкой? – Chris Smith 7 August 2009 в 21:22
  • 3
    Я имел в виду проверку перед WaitForSingleObject, если процесс еще не был создан, поэтому дескриптор все еще находился на значении, которое я инициализировал, т.е. INVALID_HANDLE_VALUE, поскольку передача INVALID_HANDLE_VALUE в WaitForSingleObject всегда истекает (т. Е. INVALID_HANDLE_VALUE никогда не используется сигнализированное состояние кажется). – Fire Lancer 13 August 2009 в 20:05

http://msdn.microsoft.com/en-us/library/ms683189%28VS.85%29.aspx

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение отличное от нуля.

Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError .

2
ответ дан dalle 31 August 2018 в 09:56
поделиться

Вы можете использовать EnumProcesses(), чтобы все процессы выполнялись в Windows. Что-то вроде:

bool IsProcessRunning(int pid)  
{  
unsigned long processes[2048];  
unsigned long num_proc = 0;  
unsigned long needed = 0;  

  // assume that 2048 processes are enought  
  if (EnumProcesses(processes, sizeof(processes), &needed))  
   num_proc = needed / sizeof(DWORD);  

  for (int i = 0; i < num_proc; i++)  
    if (processes[i] == pid)  
      return true;  

   return false;  
}
0
ответ дан Jason Plank 31 August 2018 в 09:56
поделиться
  • 1
    @gimpf По-прежнему потенциально полезно, независимо от того, насколько он сложный. – KymikoLoco 16 October 2015 в 21:21
  • 2
    Однако очень неэффективен, и поскольку он использует идентификатор процесса, а не дескриптор, при условии присущего состояния гонки. Потенциально полезен, я думаю, но, вероятно, только в случаях краев. – Harry Johnston 3 August 2017 в 21:07
1
ответ дан KymikoLoco 31 August 2018 в 09:56
поделиться
Другие вопросы по тегам:

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