台灣最大程式設計社群網站
線上人數
1563
 
會員總數:242252
討論主題:187347
歡迎您免費加入會員
討論區列表 >> VB.NET >> VB.NET Timer1計時器自動停止後執行外部程式後,再重新執行計時器就GG了
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
VB.NET Timer1計時器自動停止後執行外部程式後,再重新執行計時器就GG了
價值 : 5 QP  點閱數:513 回應數:16

樓主

愛地球
門外漢
0 1
67 5
發送站內信

VB.NET Timer1計時器自動停止後執行外部程式後,再重新執行計時器就GG了

簡略說明如下,執行外部程式完成後...Timer1無法再自動啟動...

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Timer1.Enabled = True
End Sub

Private Sub InitializeTimer()

Timer1.Interval = 1000
Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

Label1.Text = Now

Timer1.Enabled = False

....執行外部程式

Sql = " INSERT INTO 程式紀錄檔 (紀錄日期) "
Sql = Sql & " VALUES ('1070114')"

....執行外部程式完成後

Timer1.Enabled = True

Timer1無法自動執行...
Label1無法顯示時間

困擾愚弟好多天...快禿頭了...哈哈
希望各位武林高手指點愚弟一下
感激不盡....

搜尋相關Tags的文章: [ Timer1 ] , [ 計時器 ] , [ 自動停止 ] , [ 自動執行 ] ,
本篇文章發表於2018-01-14 12:34
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小魚
檢舉此回應
剛剛簡單測試了一下,
照理說應該是可以正常執行,
可能要看你完整的程式碼才會知道。
本篇文章回覆於2018-01-14 15:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

愛地球
檢舉此回應
感謝樓上大大熱心幫忙...
程式碼如下

Imports System.Data.OleDb
Public Class Form1
Dim sql As String
Dim sqlconn As New OleDbConnection
Dim ds As DataSet
Dim mycom As OleDbCommand

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Timer1.Enabled = True
End Sub
Private Sub InitializeTimer()
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Try

Label1.Text = Now

外部程式()

Catch ex As Exception

End Try

End Sub

Sub 外部程式()

Timer1.Enabled = False

Label1.Text = "複製中..."
My.Computer.FileSystem.CopyDirectory("C:\Intel", "d:\backup", True)

sqlconn.ConnectionString() = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\資料庫.mdb;Persist Security Info=False;Jet OLEDB:Database Password=XXX"
sqlconn.Open()

sql = " INSERT INTO 程式紀錄檔 (紀錄日期) "
sql = sql & " VALUES ('備份資料成功')"

mycom = New OleDbCommand(sql, sqlconn)

mycom.ExecuteNonQuery()

sqlconn.Close()

Timer1.Enabled = True

End Sub
End Class

執行外部程式後,Label1.Text無法變回時間
Label1.Text = Now

麻煩大家囉...謝謝!
本篇文章回覆於2018-01-14 16:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

練武功
檢舉此回應
根據我的臆測
你的外部程式其實一直在執行,但外部程式持續啟動Timer1,所以整個執行程序一直未能從Timer1跳出,類似再跑無限迴圈。而Label1.Text必須等到Timer1執行完畢後才會更新,所以你一直等不到Label1.Text顯示Now。
建議
1.在Label1.Text=Now後方加
Label1.UpDate
不一定有效。
2.外部程序改成工作執行緒
本篇文章回覆於2018-01-14 17:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

練武功
檢舉此回應
另外想到一種
在Label1.Text=Now後方加
Application.DoEvents()
但不見得有效。
自己試試看
本篇文章回覆於2018-01-14 17:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

誰是誰
檢舉此回應
My.Computer.FileSystem.CopyDirectory("C:\Intel", "d:\backup", True) <--- 這件事一秒做得完 ?
本篇文章回覆於2018-01-14 18:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

誰是誰
檢舉此回應
喔,對,我有一個疑問,你寫了


但卻沒有看到你呼叫這個 InitializeTimer ,那這樣,預設的 Interval 應該是 60 秒
本篇文章回覆於2018-01-14 18:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

愛地球
檢舉此回應
感謝3F大大回應...
1.Label1.UpDate無效
2.外部程序改成工作執行緒...不會使用...是否可實際指導

感謝4F大大回應...
1.Application.DoEvents()無效

感謝5F大大回應...
1.My.Computer.FileSystem.CopyDirectory("C:\Intel", "d:\backup", True)
這件事一秒做得完 ?<--- 因不知如何寫...哈哈

感謝6F大大回應...
我是參考如下資料
https://msdn.microsoft.com/zh-tw/library/3tszykws(v=vs.110).aspx

希望各位大大...再幫忙解答...謝謝囉!
本篇文章回覆於2018-01-14 18:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

練武功
檢舉此回應
#5F
根據我的想法
作者在執行外部程式時,已經關閉Timer1,理論上Timer1應該不會再計時了,所以不管外部程式執行再久,應該與Timer1無關了吧。

#6F
我使用vb2008在Form拉一個Timer時,他的預設=100,而您說他預設60秒,為何呢?

#7F
這是我的測試程式

test模擬外部程式
但是TextBox1都可以寫出次數和時間,即使沒有加上Update也可以。
你的外部程式有無單獨測試過,有無問題。
請你把外部程式的Timer1.Enabled=True拿掉,也就是只跑一次,如果跑不出結果,就是你的外部程式有問題。
本篇文章回覆於2018-01-14 19:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

誰是誰
檢舉此回應
To 8F:
你對,我記到了 Web.UI.Timer 的 Interval。

To 樓主:
我發現一個奇怪的地方,
Try

Label1.Text = Now

外部程式()

Catch ex As Exception

End Try

End Sub

你在 Catch 後把 Exception 吞掉, 要是真的發生甚麼錯誤,你也不知道啥事。

Catch ex As Exception
'' 在這邊加上 Debug.WriteLine(ex.ToString()) 之類的,確認是不是有 exception 發生
End Try

本篇文章回覆於2018-01-14 21:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

小魚
檢舉此回應
To 8樓:

我有試過在Timer1_Tick中關掉,

做別的事

再把Timer打開,
還是會繼續跑Timer的,
當然間隔時間就會跟原本的不一樣,
等於是從頭開始算。
本篇文章回覆於2018-01-15 00:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
樓主該不會是在寫【資料夾 定時同步程式】...

本篇文章回覆於2018-01-15 11:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

愛地球
檢舉此回應
#3F 臆測類似再跑無限迴圈...真聰明
我實際對Timer如何"運用自如"...還不太了解...
之後想想不要放在副程式...就可以了...感謝囉...

#11F 寫【資料夾 定時同步程式】...打對了...謝謝

Imports System.Data.OleDb
Public Class Form1
Dim sql As String
Dim sqlconn As New OleDbConnection
Dim ds As DataSet
Dim mycom As OleDbCommand

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Timer1.Enabled = True
End Sub
Private Sub InitializeTimer()
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Try

Label1.Text = Now

Timer1.Enabled = False

Label1.Text = "複製中..."
My.Computer.FileSystem.CopyDirectory("C:\Intel", "d:\backup", True)

sqlconn.ConnectionString() = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\資料庫.mdb;Persist Security Info=False;Jet OLEDB:Database Password=XXX"
sqlconn.Open()

sql = " INSERT INTO 程式紀錄檔 (紀錄日期) "
sql = sql & " VALUES ('備份資料成功')"

mycom = New OleDbCommand(sql, sqlconn)

mycom.ExecuteNonQuery()

sqlconn.Close()

Timer1.Enabled = True

Catch ex As Exception

End Try

End Sub

End Class

萬分感謝大家這幾天的幫忙...
本篇文章回覆於2018-01-15 21:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

誰是誰
檢舉此回應
你依然是把 exception 在沒有任何處理下吞掉了, 這是一個不好的習慣
本篇文章回覆於2018-01-16 14:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

愛地球
檢舉此回應
感謝大家囉...愚弟會改進...謝謝
本篇文章回覆於2018-01-16 17:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

風燭殘年
捐贈 VP 給 風燭殘年 檢舉此回應
資料夾定時同步程式
My.Computer.FileSystem.CopyDirectory("C:\Intel", "d:\backup", True)
不就每次都要重新覆製那些已存在的相同檔案
可以試試使用 FileSystemWatcher 來對資料夾進行處理喔.
本篇文章回覆於2018-02-23 10:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.