tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルシャットダウン時にAPも終了させたい
記事No6424
投稿日: 2007/10/12(Fri) 11:46
投稿者mojimoji
数分置きに実行するプログラムを作ってみましたが
ログオフやシャットダウン時に「プログラム終了します」の
メッセージが表示されてしまうので、いろいろ検索して
SystemEvents.SessionEndingイベントを参考にしました。
それでも表示されてしまいます。
表示されない方法は、あるのでしょうか。

初心者なので無理なのかもしれませんが、よろしくお願いします。

Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) _
        Handles MyBase.Load
    AddHandler SystemEvents.SessionEnding, _
        AddressOf SystemEvents_SessionEnding
End Sub

Private Sub Form1_Activated(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Me.Activated

        Do
            '処理
            'Thread.Sleep メソッドで一定時間待機状態
    Loop
End Sub

Private Sub SystemEvents_SessionEnding( _
        ByVal sender As Object, _
        ByVal e As SessionEndingEventArgs)

    If e.Reason = SessionEndReasons.Logoff Then
            Me.Close()
            'Application.Exit()でもダメ
    ElseIf e.Reason = SessionEndReasons.SystemShutdown Then
            Me.Close()
    End If

End Sub

[ツリー表示へ]
タイトルRe: シャットダウン時にAPも終了させたい
記事No6426
投稿日: 2007/10/12(Fri) 14:10
投稿者y4yama
> ログオフやシャットダウン時に「プログラム終了します」の
> メッセージが表示されてしまうので、いろいろ検索して

なかなか、「プログラム終了します」のメッセージが表示されないので
テストを楽しんでいました
Private Sub Button1_Click(ByVal sender As System.Object,
  ByVal e As System.EventArgs) Handles Button1.Click

        Do
            Thread.Sleep(100)
            'Application.DoEvents()
        Loop
End Sub
ログオフの時に、確認しました
で、DoEventsを活かしたら、メッセージが表示されずにすぐにログオフされましたが・・
(ピントが外れていたら、ごめんなさい)

[ツリー表示へ]
タイトルRe: シャットダウン時にAPも終了させたい
記事No6429
投稿日: 2007/10/12(Fri) 15:52
投稿者mojimoji
y4yamaさん
早速ありがとうございます。
> Private Sub Button1_Click(ByVal sender As System.Object,
>   ByVal e As System.EventArgs) Handles Button1.Click
>
>         Do
>             Thread.Sleep(100)
>             'Application.DoEvents()
>         Loop
> End Sub

確かに、Button1_Clickの場合はうまくいくのですがForm1_Activatedです。
ザンネン
できれば、このAPをスタートアップに入れて、Buttonも押さないで
人知れず処理してもらいたいのです。そのためにFormは非表示にしています。

[ツリー表示へ]
タイトルRe^2: シャットダウン時にAPも終了させたい
記事No6430
投稿日: 2007/10/12(Fri) 16:17
投稿者y4yama
> 確かに、Button1_Clickの場合はうまくいくのですがForm1_Activatedです。
> ザンネン
Form1_Activatedでやってみたけど・・・うまくいきますが・・・
'Application.DoEvents()がコメントだと、聞いてくるし・・
そうでないなら、聞いてこないし・・
何が、ザンネンなのでしょう?

> 人知れず処理してもらいたいのです。そのためにFormは非表示にしています。
Form1_Activatedの中で、Me.Showをしない限りはFormは表示もされないですね
勉強になりました (^^

[ツリー表示へ]
タイトルRe^3: シャットダウン時にAPも終了させたい
記事No6433
投稿日: 2007/10/12(Fri) 17:20
投稿者mojimoji
先にごめんなさい。
> 何が、ザンネンなのでしょう?
自分自身に対してです。気にしないください。

理由は全然わかりませんが
System.Threading.Thread.Sleep(6000)のときは、終了しました。
でも
System.Threading.Thread.Sleep(60000)のときは、ダメ。
「プログラムの終了中です...お待ちください。」が表示されるので
仕方なく「すぐに終了(E)」をクリックです。

Sleepの時間を短くすると、遅くなりそうなので
長めに5分とか10分とかにしたいのですが
解決策はあるのでしょうか。よろしくお願いします。<m(__)m>

[ツリー表示へ]
タイトルRe^4: シャットダウン時にAPも終了させたい
記事No6443
投稿日: 2007/10/15(Mon) 09:10
投稿者y4yama
> System.Threading.Thread.Sleep(6000)のときは、終了しました。
>
> Sleepの時間を短くすると、遅くなりそうなので
Sleep(1000)で1秒毎にDoEventsをしても、システム負荷は微々たるものです。
5分ならば5*60=300回毎に1回だけ、(目的の)処理をすればいいかと思います。

話は変わりますが、Thread.Sleep()でWaitを取るのは、いかがなものかと。
デザイン画面で普通に作るTimer1で、5分ならば5*60=300回とか
で、実現するのがBetterと信じています。
60000だとダメなのは、ウィンドウズのメッセージをSleepの間は受け取れないから、です

(目的の)処理が、1秒(6秒?)以内で必ず終わるものなら以下の問題はないですが、
長い処理の途中でログオフされてしまうと、マズイのでは?
で、私が、初心者なりにサーバ的ソフトでやっているのは
1.共通の(ロック)ファイルを設定しておいて、サーバのDownの前には、別のクライアントから、このファイルをOnしてやり、そうしたら、サーバ的ソフトは(ファイルを見て)以降は長い処理に取り掛からない、またResファイルを返す・・とか。
2.TCPのソケット通信で、別のクライアントから、長い処理に取り掛からない・という信号(文字)を送るのも比較的簡単です

[ツリー表示へ]
タイトルRe^5: シャットダウン時にAPも終了させたい
記事No6446
投稿日: 2007/10/15(Mon) 12:43
投稿者mojimoji
ありがとうございました。
> デザイン画面で普通に作るTimer1で、5分ならば5*60=300回とか
> で、実現するのがBetterと信じています。
Timer忘れていました。

> 60000だとダメなのは、ウィンドウズのメッセージをSleepの間は受け取れないから、です
なるほど。だから終了できなかったのですね。

以下のことは超々初心者なので、あまり理解できません。
教えていただいたのにすみません。
> (目的の)処理が、1秒(6秒?)以内で必ず終わるものなら以下の問題はないですが、
> 長い処理の途中でログオフされてしまうと、マズイのでは?
> で、私が、初心者なりにサーバ的ソフトでやっているのは
> 1.共通の(ロック)ファイルを設定しておいて、サーバのDownの前には、別のクライアントから、このファイルをOnしてやり、そうしたら、サーバ的ソフトは(ファイルを見て)以降は長い処理に取り掛からない、またResファイルを返す・・とか。
> 2.TCPのソケット通信で、別のクライアントから、長い処理に取り掛からない・という信号(文字)を送るのも比較的簡単です

ようやく解決できました。コードは↓の通りです。
お忙しいところ、ありがとうございます。

Imports Microsoft.Win32
Public Class Form1

    Dim X As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler SystemEvents.SessionEnding, _
            AddressOf SystemEvents_SessionEnding
        Timer1.Interval = 300000
        Timer1.Enabled = True 'Timer1を有効にする。
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, _
    '処理
    End Sub

    Private Sub SystemEvents_SessionEnding(ByVal sender As Object, _
        ByVal e As SessionEndingEventArgs)
        If e.Reason = SessionEndReasons.Logoff Then
            Me.Close()
        ElseIf e.Reason = SessionEndReasons.SystemShutdown Then
            Me.Close()
        End If
    End Sub
End Class

[ツリー表示へ]