2013-10-31 142 views
0

我在進程上使用waitFor命令時遇到了問題。我的代碼是這樣的waitFor命令不等待

//preconditions 
try{ 
    // lock the work station 
    Process p= Runtime.getRuntime().exec("C:\\Windows\\System32\\rundll32.exe user32.dll,LockWorkStation"); 
    int exitval=p.waitFor(); 
    // If the authentication is successful 
    if(exitval==0) 
    { 
    //statements to insert into database 
    } 
} 
catch(IOException e) 
{ 
    e.printStackTrace(); 
} 
catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

過程被鎖定畫面精細,但它在退出之前,用戶實際上是能夠與「0」的退出值驗證和程序插入語句到我的數據庫。我希望進程等待用戶成功通過身份驗證,然後將我的數據插入數據庫。我已經搜索了很多,但沒有取得任何成功。我應該使用不同的過程來鎖定屏幕嗎?

+1

您是否嘗試在命令行中添加'/ wait'參數? – Maroun

+0

如果只檢查一次! –

+2

@PhilippSander這有什麼問題? 'waitFor()'應該等待進程完成。 – Maroun

回答

0

LockWorkStation是一個異步功能。它會一直立即返回而不是等待解鎖。當從控制檯運行C:\Windows\System32\rundll32.exe user32.dll,LockWorkStation時,您甚至可以在之前很快看到下一個命令提示符,屏幕被鎖定。換句話說,這與Java和Process.waitFor()無關。

+0

我明白了,你知道還有其他的工作嗎?我基本上鎖定了屏幕,因爲程序檢測到了鍵盤使用中的一些差異。解鎖可確保使用桌面的用戶是實際的「經過身份驗證的用戶」。所以我想在用戶解鎖工作站後執行'insert語句'。謝謝! – RNP

2

在執行LockWorkStation時被調用。請注意,它執行異步

BOOL WINAPI LockWorkStation(void); 
If the function succeeds, the return value is nonzero. Because the function executes asynchronously, 
a nonzero return value indicates that the operation has been initiated. It does not indicate whether 
the workstation has been successfully locked. 

此外,在上面的代碼,你需要執行的過程。

在你的問題中提出,變革:

Process p= Runtime.getRuntime().("C:\\Windows\\System32\\rundll32.exe user32.dll,LockWorkStation"); 
int exit = p.waitFor(); 

Process p= Runtime.getRuntime().exec("C:\\Windows\\System32\\rundll32.exe user32.dll,LockWorkStation"); 
int exit = p.waitFor(); 

而且,你可能要考慮使用ProcessBuilder代替的Runtime.exec()

+0

有執行前,但錯過了它,而張貼在這裏。抱歉。它不包括執行包括 – RNP

+0

你可以downvote這個? – RNP

+1

上面的代碼提供了使線程等待進程完成的正確方法。你現在在你的問題描述中有正確的。如果它還早,這個問題就出現在其他地方(不是在java代碼中),可能是你用來鎖定屏幕的命令。 (注意:我不熟悉命令是如何工作的:/) – cmd