史萊姆論壇

返回   史萊姆論壇 > 綜合討論二區 > 生活話題、日常閒聊、喇勒唬爛灌水區
忘記密碼?
註冊帳號 論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』


發文 回覆
 
主題工具 顯示模式
舊 2018-10-10, 09:30 PM   #1
魔術王子
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:37 | 在線時長:1581小時 | 升級還需:15小時級別:37 | 在線時長:1581小時 | 升級還需:15小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2275
精華: 0
現金: 11690 金幣
資產: 2675210 金幣
預設 灌水 - [魔術程式]來看程式魔術秀吧

這是之前設計過的三個魔術程式,結合成一個表演程式
並不是完全複製,有的是修正錯誤,讓表演流暢點,有的是改變程序,用另一種方式表演
剛完成,所以還沒加入語音(應該說是迫不及待想炫耀吧)
目前先測試,未來會分享完整的版本
不曉得有沒有人願意捧場一下,給點意見
因為以後若有機會,小王子想用這種方式讓更多人接觸魔術,謝謝
https://drive.google.com/file/d/1RMR...ew?usp=sharing
__________________
魔術就是欣賞神奇的效果
如果魔術的秘密被破解了
那魔術就失去欣賞的價值
魔術王子 目前離線  
送花文章: 1199, 收花文章: 1328 篇, 收花: 3548 次
回覆時引用此帖
有 2 位會員向 魔術王子 送花:
a471 (2018-10-10),mini (2018-10-11)
感謝您發表一篇好文章
舊 2018-10-11, 12:06 PM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時
註冊日期: 2002-12-07
文章: 11963
精華: 0
現金: 23170 金幣
資產: 3020570 金幣
預設

意見...
要包在一起可以,最好是由玩家選擇看哪一項表演
下一項表演忽然就接上的說...
最好底圖(桌面) 每次都換一個
讓人有主題感

一般來說我們不是魔術師
不知道魔術師要給大家帶來什麼驚奇
如果只是跟著魔術師步驟走
容易讓人進入癡呆狀態
這點要如何改進? 說真的是很多魔術的罩門
一些大型魔術能成功就是突破這一點
例如~ 大衛說:我要讓自由女神消失、我要穿牆、就算不說出來,忽然把簽名的牌燒掉又變出來
都是因為 觀眾 建立了預期感,結果則是魔術的通則 "不可思議"
mini 目前離線  
送花文章: 1716, 收花文章: 7468 篇, 收花: 25908 次
回覆時引用此帖
向 mini 送花的會員:
魔術王子 (2018-10-11)
感謝您發表一篇好文章
舊 2018-10-11, 07:03 PM   #3 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:37 | 在線時長:1581小時 | 升級還需:15小時級別:37 | 在線時長:1581小時 | 升級還需:15小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2275
精華: 0
現金: 11690 金幣
資產: 2675210 金幣
預設

其實這段時間小王子一直再思所還有什麼魔術可以設計成程式
最後想不出來,只好出此下策,以表演的名義將以前寫過的程式重寫,順便改進缺點
要將魔術分開讓觀眾選擇也是做得到,小王子在測試的過程就是利用這個方式一個一個測試的
只是小王子看魔術教學帶時,魔術師都是這樣連續表演的
只不過錄成教學帶後,確實可以讓觀賞的人選擇要看哪一段魔術
但小王子比較喜歡這種連續性的魔術可以將上一段的梗拿來下一段用,可以讓觀眾學得有趣
若是大家覺得這樣設計很好,等這個魔術設計好後,小王子會試著將之前寫過的程式整理成這樣

其實小王子的想法是表演魔術時,不能讓觀眾先知道你要表演的魔術名稱,當然啦,還是要看魔術的性質而定啦
這樣表演時,觀眾就會專注你的表演,猜測接下來的結果或看不出效果,然後因結果與設想的不同或效果太過驚奇而大笑
直接說明主題會讓觀眾心裡有一個底,猜測得到這魔術最後的效果,反而降低驚奇感
除非你能夠知道觀眾心理會怎麼想, 而讓魔術最後呈現出來的效果讓超出觀眾的預料
而一些大型魔術,直接揭露主題最主要是因為這些效果給觀眾觀念就是不可能發生的事,反而可以引起觀眾的好奇心,前往觀賞,算是一種宣傳手法吧
小王子偏向的魔術是逗觀眾開心而不是製造驚奇,不可思議的魔術
像是跟觀眾聊天,然後隨手拿起周邊的事物,製造成魔術效果,讓觀眾驚訝之餘,開懷大笑
魔術王子 目前離線  
送花文章: 1199, 收花文章: 1328 篇, 收花: 3548 次
回覆時引用此帖
向 魔術王子 送花的會員:
mini (2018-10-11)
感謝您發表一篇好文章
舊 2018-10-13, 10:45 PM   #4 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:37 | 在線時長:1581小時 | 升級還需:15小時級別:37 | 在線時長:1581小時 | 升級還需:15小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2275
精華: 0
現金: 11690 金幣
資產: 2675210 金幣
預設

修改好了
https://drive.google.com/file/d/1RMR...ew?usp=sharing
家入語音後有14MB,壓縮後也有9MB

魔術王子 目前離線  
送花文章: 1199, 收花文章: 1328 篇, 收花: 3548 次
回覆時引用此帖
舊 2018-10-16, 08:30 PM   #5 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時
註冊日期: 2002-12-07
文章: 11963
精華: 0
現金: 23170 金幣
資產: 3020570 金幣
預設

.觀眾也是魔術師 在 最後階段(驗證控牌後)
點 左上角的 Joker 會跑出錯誤訊息
不過程式還可以繼續進行

.鬼牌找牌也有一些動作外的例外(如果沒跟著指示 亂點,就會有類似跳針的邏輯混亂)

一個建議
能在右下角設計個(或保持) "離開" 選項嗎? (因為點 右上角[X]的話 沒反應...)
也就是不一定要等到 魔術表演完 才能選擇 "離開"

.最後一點 ?的地方
如果按下視窗的 還原(右上角兩個 矩形重疊 的按鈕)
程式的背景圖
會變得無法更新而破碎 (因翻牌或移動而破碎)

其餘基本上還不錯~
mini 目前離線  
送花文章: 1716, 收花文章: 7468 篇, 收花: 25908 次
回覆時引用此帖
向 mini 送花的會員:
魔術王子 (2018-10-16)
感謝您發表一篇好文章
舊 2018-10-16, 10:16 PM   #6 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:37 | 在線時長:1581小時 | 升級還需:15小時級別:37 | 在線時長:1581小時 | 升級還需:15小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2275
精華: 0
現金: 11690 金幣
資產: 2675210 金幣
預設

引用:
作者: mini 查看文章
.觀眾也是魔術師 在 最後階段(驗證控牌後)
點 左上角的 Joker 會跑出錯誤訊息
不過程式還可以繼續進行

.鬼牌找牌也有一些動作外的例外(如果沒跟著指示 亂點,就會有類似跳針的邏輯混亂)

一個建議
能在右下角設計個(或保持) "離開" 選項嗎? (因為點 右上角[X]的話 沒反應...)
也就是不一定要等到 魔術表演完 才能選擇 "離開"

.最後一點 ?的地方
如果按下視窗的 還原(右上角兩個 矩形重疊 的按鈕)
程式的背景圖
會變得無法更新而破碎 (因翻牌或移動而破碎)

其餘基本上還不錯~
謝謝
這算是測試性質的程式
使用很多不合程式理論的嘗試
未來會想辦法改進的
最近在進行一個新的魔術程式(第九個魔術,其實在第二次史版網聚有表演過)
這次小王子會盡量設計完整
魔術王子 目前離線  
送花文章: 1199, 收花文章: 1328 篇, 收花: 3548 次
回覆時引用此帖
舊 2018-10-16, 10:19 PM   #7 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:37 | 在線時長:1581小時 | 升級還需:15小時級別:37 | 在線時長:1581小時 | 升級還需:15小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2275
精華: 0
現金: 11690 金幣
資產: 2675210 金幣
預設

按[X]沒回應,應該是這個原因
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if(Tag==-1) CanClose=false;
}
//---------------------------------------------------------------------------
因為在播放語音或洗牌時,若按[X]會出現程式管理員錯誤的訊息
魔術王子 目前離線  
送花文章: 1199, 收花文章: 1328 篇, 收花: 3548 次
回覆時引用此帖
舊 2018-10-20, 08:32 AM   #8 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:37 | 在線時長:1581小時 | 升級還需:15小時級別:37 | 在線時長:1581小時 | 升級還需:15小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2275
精華: 0
現金: 11690 金幣
資產: 2675210 金幣
預設

為了製造延遲效果,程式裡面使用了
do { Application->ProcessMessages(); } while (GetTickCount() - BeginTime < MSecs);
然而當延遲執行時,整個系統都被佔住,所以在延遲完結之前,是無法停止程式的
"程式的背景圖 會變得無法更新而破碎 (因翻牌或移動而破碎)"
應該也是這個原因造成的
而透過PostMessage(Handle, WM_CLOSE, 0, 0);的API指令也無法結束程式
最後必須利用taskkill指令達成,但洗牌的程式依舊有問題
WinExec("taskkill /F /IM MGProg02.exe",SW_HIDE);
但動作這有些不合程式理論
魔術王子 目前離線  
送花文章: 1199, 收花文章: 1328 篇, 收花: 3548 次
回覆時引用此帖
舊 2018-10-20, 12:20 PM   #9 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時級別:86 | 在線時長:7853小時 | 升級還需:64小時
註冊日期: 2002-12-07
文章: 11963
精華: 0
現金: 23170 金幣
資產: 3020570 金幣
預設

VB 可以用DoEvents解決
一般來說 轉成C++就是用 Application->ProcessMessages
但既然魔王說無法達到效果
可能就要用多執行續 (另一個執行續專職檢查結束條件)
或模擬VB裡的 Timer物件 (每xx ms檢查一次)
mini用VB就非常喜歡Timer物件

BCB好像也有 Timer物件可用...
如都不行
那迴圈 可以試試用 Win API的 MsgWaitForMultipleObjects、SetWaitableTimer...等來架構

以下是 VB6時期用的 高精密度 wait函式
PHP 語法:
'****************
'
*   計時模組   *
'****************
Option Explicit

Public Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As Long
        bInheritHandle As Long
End Type

'
lpSemaphoreAttributes As SECURITY_ATTRIBUTES
Private Declare Function CreateWaitableTimer Lib "kernel32" Alias "CreateWaitableTimerA" _
    ByVal lpSemaphoreAttributes 
As Long_
    ByVal bManualReset 
As Long_
    ByVal lpName 
As String) As Long
'==說明==
'
創建一個可等待的計時器對像

'==返回值==
'
Long,如執行成功,返回可等待計時器對象的句柄;零表示出錯。
'會設置GetLastError。即使返回一個有效的句柄,但倘若它指出同名的一個計時器對像已經存在,
'
那麼GetLastError也會返回ERROR_ALREADY_EXISTS

'==參數表==
'
參數                   類型 及說明
'lpSemaphoreAttributes  SECURITY_ATTRIBUTES ,指定一個結構,用於設置對象的安全特性。如將參數聲明為ByVal As Long,並傳遞零值,就可使用對象的默認安全設置
'
bManualReset           Long                ,如果為TRUE,表示創建一個人工重設計時器;如果為FALSE,則創建一個自動重設計時器
'lpName                 String              ,指定可等待計時器對象的名稱。用vbNullString可創建一個未命名的計時器對象。如果已經存在擁有這個名字的一個可等待計時器,就直接打開現成的可等待計時器。這個名字可能不與一個現有的互斥體、事件、信號機或文件映射的名稱相符

'
==註解==
'一旦不再需要,一定記住用CloseHandle關閉計時器對象的句柄。
'
它的所有句柄都關閉以後,對像自己也會刪除



Private Declare Function CancelWaitableTimer Lib "kernel32" (ByVal hTimer As Long)
'==說明==
'
這個函數用於取消一個可以等待下去的計時器操作。
'計時器保持它當前的狀態,而且除非用SetWaitableTimer函數明確啟動,否則它不會重新啟動

'
==返回值==
'Long,非零表示成功,零表示失敗。會設置GetLastError

''==參數表==
'
參數           類型及說明
'hTimer Long    ,可等待計時器的句柄

'
==適用平台==
'Windows NT

Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type

Private Declare Function SetWaitableTimer Lib "kernel32" ( _
    ByVal hTimer As Long, _
    lpDueTime As FILETIME, _
    ByVal lPeriod As Long, _
    ByVal pfnCompletionRoutine As Long, _
    ByVal lpArgToCompletionRoutine As Long, _
    ByVal fResume As Long) As Long
'
==說明==
'啟動一個可等待計時器。將它設為未發信號狀態

'
==返回值==
'Long,非零表示成功,零表示失敗。會設置GetLastError

'
==參數表==
'參數                   類型及說明
'
hTimer                 Long,指定一個可等待計時器的句柄
'lpDueTime              FILETIME,指定一個包含了64位時間值的結構。如果為正,它代表計時器要觸發的時間。如果為負,它代表自函數調用以來持續的時間。時間是以100ns為單位指定的
'
lPeriod                Long,如果為零,這個計時器只會觸發一次。否則,計時器會根據這裡設置的持續時間自動重新啟動(以毫秒為單位指定)
'pfnCompletionRoutine   Long,指定零或者計時器觸發時要調用的一個函數的地址。可在標準模塊中用一個函數通過AddressOf操作符提供這個地址。或者使用此類ocx控件。
'           
最終的例程採取下述形式: Sub myfunc(ByVal lpArgToCompletion&, ByVal dwTimerLow&, ByVal dwTimerHigh&)
'lpArgToCompletionRoutine Long,傳遞給最終例程的值
'
fResume Long,如果為TRUE,而且系統支持電源管理,那麼在計時器觸發的時候,系統會退出省電模式。如設為TRUE,但系統不支持省電模式,GetLastError就會返回ERROR_NOT_SUPPORTED

'==適用平台==
'
Windows NT
 

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'==說明==
'
關閉一個內核對象。其中包括文件、文件映射、進程、執行緒、安全和同步對像等。
'涉及文件處理時,這個函數通常與vb的close命令相似。
'
應盡可能的使用close,因為它支持vb的差錯控制。
'注意這個函數使用的文件句柄與vb的文件編號是完全不同的

'
==返回值==
'Long,非零表示成功,零表示失敗。會設置GetLastError

'
==參數表==
'參數       類型    及說明
'
hObject    Long    ,欲關閉的一個對象的句柄

'==註解==
'
除非對內核對象的所有引用都已關閉 否則該對像不會實際刪除
 
Private Declare Function MsgWaitForMultipleObjects Lib "user32" _
    ByVal nCount 
As Long_
    pHandles 
As Long_
    ByVal fWaitAll 
As Long_
    ByVal dwMilliseconds 
As Long_
    ByVal dwWakeMask 
As Long) As Long
'==說明==
'
等候單個對象或一系列對像發出信號---標誌著規定的超時已經過去,
'或特定類型的消息已抵達執行緒的輸入隊列。如返回條件已經滿足,則立即返回

'
==返回值==
'Long               ,如fWaitAll設為TRUE,則下述任何一個常數都標誌著成功:
'
WAIT_ABANDONED_0: 所有對象都發出消息,而且其中一個或多個屬於互斥體(一但擁有它門的進程中止,就會發出信號)。
'WAIT_TIMEOUT:      對像保持未發信號的狀態 , 但規定的等待超時時間已經超過
'
WAIT_OBJECT_0:     所有的對象都發出信號
'WAIT_TO_COMPLETION (僅適用於WaitForSingleObjectEx),由於一個I/O完成操作已準備好執行,從而造成了函數的返回。
'
返回WAIT_FALIED表示函數執行失敗。會設置GetLastError
'如fWaitAll設為FALSE,那返回結果與前面說的相似,只是可能還會返回相對於WAIT_ABANDONED_0或WAIT_OBJECT_0的一個正偏移量,指出哪個對象是被拋棄還是發出信號。
'
如果是由於dwWakeMask指定的 符合特殊標準的一條消息的到達而造成了函數的返回則返回WAIT_OBJECT_0 nCount

'==參數表==
'
參數           類型    及說明
'nCount         Long    ,指定列表中的句柄數量
'
pHandles       Long    ,指定對像句柄組合中的第一個元素
'fWaitAll       Long    ,如果為TRUE,表示除非對像同時發出信號,否則就等待下去。如果為FALSE,表示任何對像發出信號即可。
'
dwMilliseconds Long    ,指定要等待的毫秒數。
'dwWakeMask     Long    ,帶有QS_??前綴的一個或多個常數,用於標識特定的消息類型。

'
==註解==
'如果函數是由於對像發出信號而返回 , 這個函數還會得到一些額外的效果:
 
'
信號機遞增信號機計數
'互斥體: 將互斥體的所有權限賦於發出調用的執行緒
'
自動重設事件將事件發信狀態設為FALSE
'自動重設可等待計時器: 將計時器狀態設為FALSE



Private Declare Function OpenWaitableTimer Lib "kernel32" _
    Alias "OpenWaitableTimerA" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal lpName As String) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" ( _
    ByVal hHandle As Long, _
    ByVal dwMilliseconds As Long) As Long


Private Const WAIT_OBJECT_0& = 0
Private Const WAIT_OBJECT_1& = 1
Private Const WAIT_FAILED& = -1&
Private Const WAIT_TIMEOUT& = &H102&
Private Const WAIT_ABANDONED& = &H80&
Private Const WAIT_ABANDONED_0& = &H80&
Private Const WAIT_IO_COMPLETION& = &HC0&

Private Const INFINITE = &HFFFF
Private Const ERROR_ALREADY_EXISTS = 183&

'
消息響應
Private Const QS_HOTKEY& = &H80
Private Const QS_KEY& = &H1
Private Const QS_MOUSEBUTTON& = &H4
Private Const QS_MOUSEMOVE& = &H2
Private Const QS_PAINT& = &H20
Private Const QS_POSTMESSAGE& = &H8
Private Const QS_SENDMESSAGE& = &H40
Private Const QS_TIMER& = &H10
Private Const QS_MOUSE& = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Private Const 
QS_INPUT& = (QS_MOUSE Or QS_KEY)
Private Const 
QS_ALLEVENTS& = (QS_INPUT _
                            
Or QS_POSTMESSAGE _
                            
Or QS_TIMER _
                            
Or QS_PAINT _
                            
Or QS_HOTKEY)
Private Const 
QS_ALLINPUT& = (QS_SENDMESSAGE _
                            
Or QS_PAINT _
                            
Or QS_TIMER _
                            
Or QS_POSTMESSAGE _
                            
Or QS_MOUSEBUTTON _
                            
Or QS_MOUSEMOVE _
                            
Or QS_HOTKEY _
                            
Or QS_KEY)

'GetTickCount()
'
Windows NT 3.5 及更高版本,精度為 10ms
'Windows NT 3.1 及更高版本,精度為 16ms
'
Windows 95 及更高版本,精度為 55ms

'timeGetTime()
'
精度約1ms 此式適用於大多數應用場合,實際誤差在10ms

'1s = 1000ms = 1000000μs = 1000000000ns
'
它傳回Windows啟動後到目前為止所經過的時間,傳回值以微秒為單位。
Public Declare Function GetTickCount Lib "kernel32" () As Long

Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Public Type LARGE_INTEGER
    lowpart 
As Long
    highpart 
As Long
End Type

'得到處理器使用的主機板內部計時器的時鐘頻率
Private Declare Function QueryPerformanceFrequency Lib "kernel32" ( _
    lpFrequency As Currency) As Long   '
LARGE_INTEGER

Private Declare Function QueryPerformanceCounter Lib "kernel32" _
    lpPerformanceCount 
As Currency) As Long   'LARGE_INTEGER
    
Public Const MAX_TIMEINTERVAL = 65535

Public Sub Wait1(lngNumberOfSeconds As Long)
Dim ft As FILETIME
Dim lngBusy As Long
Dim lngRet As Long
Dim dblDelay As Double
Dim dblDelayLow As Double
Dim dblUnits As Double
Dim hTimer As Long
    
    hTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer")
    
    If Err.LastDllError = ERROR_ALREADY_EXISTS Then
        ' 
If the timer already existsit does not hurt to open it
        
' as long as the person who is trying to open it has the
        ' 
proper access rights.
    Else
        
ft.dwLowDateTime = -1
        ft
.dwHighDateTime = -1
        lngRet 
SetWaitableTimer(hTimerft0000)
    
End If
    
    
' Convert the Units to nanoseconds.
    dblUnits = CDbl(&H10000) * CDbl(&H10000)
    dblDelay = CDbl(lngNumberOfSeconds) * 1000 * 10000
    
    ' 
By setting the high/low time to a negative numberit tells
    
' the Wait (in SetWaitableTimer) to use an offset time as
    ' 
opposed to a hardcoded time. If it were positiveit would
    
' try to convert the value to GMT.
    ft.dwHighDateTime = -CLng(dblDelay / dblUnits) - 1
    dblDelayLow = -dblUnits * (dblDelay / dblUnits - Fix(dblDelay / dblUnits))
    
    If dblDelayLow < CDbl(&H80000000) Then
        ' 
&H80000000 is MAX_LONGso you are just making sure
        
' that you don't overflow when you try to stick it into
        
' the FILETIME structure.
        dblDelayLow = dblUnits + dblDelayLow
    End If
    
    ft.dwLowDateTime = CLng(dblDelayLow)
    lngRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, False)
    
    Do
        ' 
QS_ALLINPUT means that MsgWaitForMultipleObjects will
        
' return every time the thread in which it is running gets
        ' 
a message. If you wanted to handle messages in here you could,
        
' but by calling Doevents you are letting DefWindowProc
        ' 
do its normal windows message handling---Like DDEetc.
        
lngBusy MsgWaitForMultipleObjects(1hTimerFalseINFINITEQS_ALLINPUT&)
        
DoEvents
    Loop Until lngBusy 
WAIT_OBJECT_0
    
    
' Close the handles when you are done with them.
    CloseHandle hTimer

End Sub

'
Call Wait(10 000 000) = 1秒
Public Sub Wait(lngNumberOfaHundredNanoSeconds As Long'Long= 正負 2,147,483,647
Dim lBusy As Long
Dim lRet As Long
Dim dblDelay As Double
Dim dblDelayLow As Double
Dim dblUnits As Double
Dim hTimer As Long
Dim ft As FILETIME
'
FILETIME,指定一個包含了64位元組 時間值的結構。
'如果為正,它代表計時器要觸發的時間。
'
如果為負,它代表自函數調用以來持續的時間。
'時間是以100ns為單位指定的
'
1s 1000ms 1000000μs 1000000000ns
    
    hTimer 
CreateWaitableTimer(0TrueApp.EXEName "Timer")
    If 
Err.LastDllError ERROR_ALREADY_EXISTS Then

    
Else
        
ft.dwLowDateTime = -1
        ft
.dwHighDateTime = -1
        lRet 
SetWaitableTimer(hTimerft0000)
    
End If
    
    
'轉化為十億分之一秒 = 1奈秒(ns)
    dblUnits = CDbl(&H10000) * CDbl(&H10000)
    dblDelay = CDbl(lngNumberOfaHundredNanoSeconds) '
1000 10000 '10000000

    ft.dwHighDateTime = -CLng(dblDelay / dblUnits) - 1
    dblDelayLow = -dblUnits * (dblDelay / dblUnits - Fix(dblDelay / dblUnits))
    
    '
&H80000000是最大長度,所以你在寫入FILETIME結構的時候不能超過它
    
If dblDelayLow CDbl(&H80000000Then dblDelayLow dblUnits dblDelayLow
    
    ft
.dwLowDateTime CLng(dblDelayLow)
    
lRet SetWaitableTimer(hTimerft000False)
    
    Do
        
'參數QS_ALLINPUT的意思是MsgWaitForMultipleObjects將返回每次執行緒在運行中獲得
        '
的消息響應,如果你在這裡需要獲得系統的控制權。你可以使用Doevents
        lBusy 
MsgWaitForMultipleObjects(1hTimerFalseINFINITEQS_ALLINPUT&)
        
DoEvents
    Loop Until lBusy 
WAIT_OBJECT_0
    
    
'結束時關閉定時器
    CloseHandle hTimer
    
End Sub 
這一段
PHP 語法:
    Do
        
'參數QS_ALLINPUT的意思是MsgWaitForMultipleObjects將返回每次執行緒在運行中獲得
        '
的消息響應,如果你在這裡需要獲得系統的控制權。你可以使用Doevents
        lBusy 
MsgWaitForMultipleObjects(1hTimerFalseINFINITEQS_ALLINPUT&)
        
DoEvents
    Loop Until lBusy 
WAIT_OBJECT_0 
就是替代的重點
直覺上好像可以用 MsgWaitForMultipleObjects 來解決
實際上??
mini 目前離線  
送花文章: 1716, 收花文章: 7468 篇, 收花: 25908 次
回覆時引用此帖
向 mini 送花的會員:
魔術王子 (2018-10-20)
感謝您發表一篇好文章
發文 回覆


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 03:04 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2018, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1