Нужно перестать пользователь нажимать на exe второй раз, пока он уже запущен - PullRequest
3 голосов
/ 22 ноября 2011

Я разработал exe-версию своего Java-приложения и запускаю его с флешки. Выполнение займет некоторое время. Но мой конечный пользователь считает, что он не работает, и щелкает во второй раз. Мне нужно это остановить. Мне нужно остановить непрерывный клик на exe, пока он запущен. Я использовал сценарий оболочки, чтобы проверить, работает ли exe или нет. И выводит сообщение, что exe уже запущен. И останавливает дальнейший процесс. Мне нужно, чтобы это произошло во время работы exe во второй раз. Я не мог понять это. Есть ли способ отключить exe от клика, пока он запущен. Или как я могу проверить, запущен он или нет.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;


public class VBSUtils {

      private VBSUtils() {  }

      public static boolean isRunning(String process) {
        boolean found = false;
        try {
            File file = File.createTempFile("realhowto",".vbs");
            file.deleteOnExit();
            FileWriter fw = new java.io.FileWriter(file);

            String vbs = "Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n"
                       + "Set locator = CreateObject(\"WbemScripting.SWbemLocator\")\n"
                       + "Set service = locator.ConnectServer()\n"
                       + "Set processes = service.ExecQuery _\n"
                       + " (\"select * from Win32_Process where name='" + process +"'\")\n"
                       + "For Each process in processes\n"
                       + "wscript.echo process.Name \n"
                       + "Next\n"
                       + "Set WSHShell = Nothing\n";

            fw.write(vbs);
            fw.close();
            Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
            BufferedReader input =
                new BufferedReader
                  (new InputStreamReader(p.getInputStream()));
            String line;
            line = input.readLine();
            if (line != null) {
                if (line.equals(process)) {
                  found = true;
                }
            }
            input.close();

        }
        catch(Exception e){
            e.printStackTrace();
        }
        return found;
      }



}

И в моем основном классе я позвонил VBUtils.

 boolean result = VBSUtils.isRunning("myexe.exe");
if(result)
{
     msgBox("myexe is running. Please wait");
}
else
{
 // my part of execution.
}

Если я так позвоню, exe завершится. И первое и второе исполнение.

Ответы [ 3 ]

3 голосов
/ 22 ноября 2011

Самый простой способ - представить пользователю визуальную обратную связь, чтобы он знал, что приложение запущено.(например, окно консоли с сообщениями, диалоговое окно ожидания, ...)

2 голосов
/ 22 ноября 2011

Вам нужно использовать какой-нибудь флаг, чтобы указать, что ваше приложение работает. Многие приложения используют временный файл .pid. Когда ваше приложение запускается, оно проверяет наличие файла .pid, и если оно существует, оно закрывается с сообщением об ошибке. Если файл .pid отсутствует, он создает его и работает как обычно.

1 голос
/ 22 ноября 2011

Прежде всего, в java предусмотрена очень ранняя заставка:

http://download.oracle.com/javase/6/docs/api/java/awt/SplashScreen.html

Кроме того, за RMI вы можете при запуске подключиться к любому, возможно, работающему экземпляру и остановить и передать командную строку («открыть файлы ...»). RMI позволяет воспроизводить удаленный сервер.

...