Windows服務(wù):方便地啟動(dòng)Oracle服務(wù)
2024-08-29 13:35:27
供稿:網(wǎng)友
 
                 Oracle 9i有多個(gè)系統(tǒng)服務(wù)必須都啟動(dòng)之后才能正常工作,但逐個(gè)啟動(dòng)比較費(fèi)事,多數(shù)學(xué)習(xí)Oracle但機(jī)器又不是太好的朋友也不能容忍每次都自動(dòng)啟動(dòng)Oracle服務(wù)(那樣512MB的內(nèi)存在啟動(dòng)時(shí)就所剩無幾了),所以通常都是要用了再啟動(dòng),                                                                                            這里給出了批量啟動(dòng)windows系統(tǒng)服務(wù)的一個(gè)例子,介紹了操控windows系統(tǒng)服務(wù)的技巧:
首先新建一個(gè)Windows application工程,取名為Oracle Starter
粘貼如下代碼文件:
Form1.Designer.vb
Partial Public Class Form1
    Inherits System.Windows.Forms.Form     <System.Diagnostics.DebuggerNonUserCode()> _
    Public Sub New()
        MyBase.New()        ''''This call is required by the Windows Form Designer.
        InitializeComponent()    End Sub    ''''Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    PRotected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        End If
        MyBase.Dispose(disposing)
    End Sub    ''''Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer    ''''NOTE: The following procedure is required by the Windows Form Designer
    ''''It can be modified using the Windows Form Designer.  
    ''''Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.Label1 = New System.Windows.Forms.Label
        Me.ListBox1 = New System.Windows.Forms.ListBox
        Me.Button1 = New System.Windows.Forms.Button
        Me.Button2 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        ''''
        ''''Label1
        ''''
        Me.Label1.AutoSize = True
        Me.Label1.Font = New System.Drawing.Font("Tahoma", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label1.Location = New System.Drawing.Point(13, 13)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(122, 22)
        Me.Label1.TabIndex = 0
        Me.Label1.Text = "Oracle Starter"
        ''''
        ''''ListBox1
        ''''
        Me.ListBox1.Font = New System.Drawing.Font("Tahoma", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.ListBox1.FormattingEnabled = True
        Me.ListBox1.ItemHeight = 19
        Me.ListBox1.Location = New System.Drawing.Point(13, 75)
        Me.ListBox1.Name = "ListBox1"
        Me.ListBox1.Size = New System.Drawing.Size(436, 175)
        Me.ListBox1.TabIndex = 1
        ''''
        ''''Button1
        ''''
        Me.Button1.Location = New System.Drawing.Point(322, 257)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(127, 34)
        Me.Button1.TabIndex = 2
        Me.Button1.Text = "Stop all services"
        ''''
        ''''Button2
        ''''
        Me.Button2.Location = New System.Drawing.Point(188, 258)
        Me.Button2.Name = "Button2"
        Me.Button2.Size = New System.Drawing.Size(127, 34)
        Me.Button2.TabIndex = 3
        Me.Button2.Text = "Start all servies"
        ''''
        ''''Form1
        ''''
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(461, 304)
        Me.Controls.Add(Me.Button2)
        Me.Controls.Add(Me.Button1)
        Me.Controls.Add(Me.ListBox1)
        Me.Controls.Add(Me.Label1)
        Me.Name = "Form1"
        Me.Text = "Oracle Starter"
        Me.ResumeLayout(False)
        Me.PerformLayout()
                             End Sub
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Button2 As System.Windows.Forms.ButtonEnd Class  
Form1.vb
Imports System.ServiceProcess
Imports System.Threading Public Class Form1    ''''Private procName As String
    Private procArray(5) As String                                                                                                Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        procArray(0) = "OracleMTSRecoveryService"
        procArray(1) = "OracleOraHome92Agent"
        procArray(2) = "OracleOraHome92TNSListener"
        procArray(3) = "OracleServiceSFSVDB"
        procArray(4) = "OracleOraHome92HTTPServer"
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim backThread As Thread
        Dim i As Int16
        For i = 0 To 4
            backThread = New Thread(AddressOf procClass.StopProc)
            backThread.IsBackground = True
            procClass.procName = procArray(i)
            Label1.Text = "Stopping service: " + procClass.procName + " ..."
            Me.Refresh()
            backThread.Start()
            backThread.Join()
            ListBox1.Items.Add("Service: " + procClass.procName + " Stopped")
            Me.Refresh()
            backThread = Nothing
        Next
        Label1.Text = "All services stopped"
    End Sub
                             Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim backThread As Thread
        Dim i As Int16
        For i = 0 To 4
            backThread = New Thread(AddressOf procClass.StartProc)
            procClass.procName = procArray(i)
            Label1.Text = "Starting service: " + procClass.procName + " ..."
            Me.Refresh()
            backThread.Start()
            backThread.Join()
            ListBox1.Items.Add("Service: " + procClass.procName + " Started")
            Me.Refresh()
            backThread = Nothing
        Next
        Label1.Text = "All services started"
    End Sub    Public Class procClass
        Public Shared procName As String        Public Shared Sub StopProc()
            Dim servController1 As ServiceController = New ServiceController(procName)
            If servController1.Status = ServiceControllerStatus.Stopped Then
            ElseIf servController1.Status = ServiceControllerStatus.Paused Then
                servController1.Stop()
                servController1.WaitForStatus(ServiceControllerStatus.Stopped)
            ElseIf servController1.Status = ServiceControllerStatus.Running Then
                servController1.Stop()
                servController1.WaitForStatus(ServiceControllerStatus.Stopped)
            End If
        End Sub        Public Shared Sub StartProc()
            Dim servController1 As ServiceController = New ServiceController(procName)
            If servController1.Status = ServiceControllerStatus.Running Then
            ElseIf servController1.Status = ServiceControllerStatus.Paused Then
                servController1.Continue()
                servController1.WaitForStatus(ServiceControllerStatus.Running)
            ElseIf servController1.Status = ServiceControllerStatus.Stopped Then
                servController1.Start()
                servController1.WaitForStatus(ServiceControllerStatus.Running)
            End If
        End Sub
    End Class
End Class
總結(jié):
這個(gè)實(shí)例只是運(yùn)用了系統(tǒng)服務(wù)控制的基本功能,高級(jí)功能還不甚了解,對(duì)于多線程的運(yùn)用還不是很明確,望大家指正
改進(jìn):
程序在運(yùn)行時(shí)假如焦點(diǎn)離開,用戶界面便會(huì)鎖死,雖然嘗試了多線程,仍然不理想,應(yīng)該還Join()方法有關(guān),多次修正未果,請(qǐng)高手指點(diǎn),謝謝!
                         
測(cè)試平臺(tái):
Windows Server 2003,Visual VB.NET 2005 Beta 1