[RESOLVED] problem with running duplicate threads
hey everyone. can anyone tell me how to call a function from a secondary thread. in my program, i have a background worker running. when the user clicks a button on the main form, i stop the background thread, run a function, but i cant get the background thread to start running again (i get an error saying the back ground worker is busy, which i dont get since i stopped the thread first. heres the code i got:
Code:
Private Sub BackgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As System.ComponentModel.DoWorkEventArgs) _
Handles BackgroundWorker1.DoWork
Do Until IsItCanceled = True
Dim worker As System.ComponentModel.BackgroundWorker
worker = CType(sender, System.ComponentModel.BackgroundWorker)
Dim WC As Class2 = CType(e.Argument, Class2)
WC.FindMyPort(worker, e)
Loop
End Sub
Code:
Private Sub BackgroundWorker1_ProgressChanged( _
ByVal sender As Object, _
ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
Handles BackgroundWorker1.ProgressChanged
Dim state As Class2.CurrentState = _
CType(e.UserState, Class2.CurrentState)
Me.Label10.Text = "d"
End Sub
Code:
Private Sub BackgroundWorker1_RunWorkerCompleted( _
ByVal sender As Object, _
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles BackgroundWorker1.RunWorkerCompleted
If e.Error IsNot Nothing Then
MsgBox("Error: " & e.Error.Message)
BackgroundWorker1.Dispose()
ElseIf e.Cancelled Then
MsgBox("Word counting canceled.")
BackgroundWorker1.Dispose()
Else
BackgroundWorker1.Dispose()
End If
End Sub
class2:
Code:
Option Compare Text
Imports System.Windows.Forms
Imports System.Data.OleDb
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports GsmComm.GsmCommunication
Imports GsmComm.PduConverter
Imports System.IO.Ports
Imports System.IO.Ports.SerialPort
Imports System.Text
Imports System.IO
Public Class Class2
Public Class CurrentState
Public LinesCounted As Integer
Public WordsMatched As Integer
End Class
Public SourceFile As String
Public CompareString As String
Private WordCount As Integer = 0
Private LinesCounted As Integer = 0
Public isAmodem As Boolean = False
Public Sub ShowMessage(ByRef MsgPDU As SmsDeliverPdu)
Try
Dim txtMsg As String = MsgPDU.UserDataText
Dim FromNumber As String = MsgPDU.OriginatingAddress
Dim FromAddress As String = MsgPDU.OriginatingAddress
Dim TimeStamp As String = MsgPDU.GetTimestamp.ToString
Dim MsgFromName As String = FindName(FromNumber)
Dim AddString As String = "Insert into tblInboxMsg (MsgStatus,MsgFromNum,MsgFromName,TxtMsg,MsgTimeStamp) values" _
& " ('New','" & FromAddress & "','" & MsgFromName & "','" & txtMsg & "','" & TimeStamp & "')"
Debug.Print(AddString)
' Dim FileName As String = CurDir() & "\SMSer.mdb"
Dim conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\JasonWucinski.mdb;Persist Security Info=True;Jet OLEDB:Database Password=")
Dim Cmd As OleDbCommand
Dim objCmd As New OleDbCommand
Cmd = New OleDbCommand(AddString, conn)
conn.Open()
objCmd = New OleDbCommand(AddString, conn)
objCmd.ExecuteNonQuery()
conn.Close()
'JasonWucinskiBots5
If Not (Cmd Is Nothing) Then Cmd.Dispose()
Cmd = Nothing
If Not (objCmd Is Nothing) Then objCmd.Dispose()
objCmd = Nothing
Catch ex As Exception
Debug.Print("ex.ToString")
Debug.Print(ex.ToString)
End Try
End Sub
Public Sub FindMyPort(ByVal worker As System.ComponentModel.BackgroundWorker, _
ByVal e As System.ComponentModel.DoWorkEventArgs)
If worker.CancellationPending Then
e.Cancel = True
Exit Sub
Else
Dim getState As Boolean = False
Dim getManu As String
Dim storage = getMessageStorage()
Dim MsgLocation As Integer
Dim counter As Integer = 0
Try
With comm
Try
.Open()
Dim info As IdentificationInfo = comm.IdentifyDevice
getManu = info.Manufacturer
If getManu = "huawei" Then
Try
Dim messages As DecodedShortMessage() = comm.ReadMessages(PhoneMessageStatus.ReceivedUnread, PhoneStorageType.Sim)
For Each DecodedShortMessage In messages
MsgLocation = DecodedShortMessage.Index
ShowMessage(DecodedShortMessage.Data)
counter = counter + 1
Next
Catch ex As IOException
End Try
If counter >= 1 Then
Try
MsgBox("You got a new message")
Catch ex As Exception
End Try
End If
comm.Close()
Exit Try
End If
Catch Ex As IOException
Catch Ex As Exception
End Try
End With
Catch ex As Exception
End Try
End If
Threading.Thread.Sleep(1000)
End Sub
End Class
when the user click a button, i run this (after a bunch of other stuff)
Code:
Dim WC As New Class2
IsItCanceled = False
Me.BackgroundWorker1.RunWorkerAsync(WC)
but all i get is an error saying the thread is bussy and cant have duplicates
Re: problem with running duplicate threads
Don't loop a background worker, it's really not the way to handle this. Instead, why not have the FindMyPort method spawn itself unless it is flagged to stop? By using ThreadPool.QueueUserWorkItem() rather than simply calling the method directly each time, we can avoid memory leaks.
vb.net Code:
Public Class Class2
Public continue As Boolean = True
Public Sub FindMyPort()
'Find your port
If continue Then _
ThreadPool.QueueUserWorkItem(AddressOf FindMyPort)
End Sub
End Class
Public Class Class1
Private WC As Class2
Private Sub Class1_Load( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
WC = New Class2
ThreadPool.QueueUserWorkItem(AddressOf WC.FindMyPort)
End Sub
Private Sub btnCancel_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnCancel.Click
WC.continue = False
End Sub
End Class
Re: problem with running duplicate threads
thanks for your reply. ive been trying to get your suggestion working. the only problem is that when i use this:
Code:
ThreadPool.QueueUserWorkItem(AddressOf WC.FindMyPort)
if get a blue squiggly line uner WC.FindMyPort and the error is:
Method 'Public sub FindMyPort(...)' does not have a signature compatible with delegate 'Delegate sub waitcallback(State as Object)'
what does this mean? and how do i fix it?
thanks
jason
Re: problem with running duplicate threads
When you call QueueUserWorkItem you have to pass a WaitCallback delegate. A delegate is an object with a reference to a method. AddressOf is creating a reference to your FindMyPort method. The thing is, the method must have the same signature as the delegate, i.e. the same number, type and order of parameters and the same return type. As the error message is telling you, the WaitCallback delegate is a Sub, i.e. doesn't return anything, and has a single parameter of type Object. That means that your FindMyPort method must also be a Sub and must also have one parameter of type Object. There's no necessity to actually use the parameter value in the method but it's there so that you can pass data into the method like this:
vb.net Code:
ThreadPool.QueueUserWorkItem(AddressOf WC.FindMyPort, state)
That second argument is the value that you get back from the parameter in the method.
Re: problem with running duplicate threads
ok, to fix this (i think), i changed:
Code:
Public Sub FindMyPort(ByVal worker As System.ComponentModel.BackgroundWorker, _
ByVal e As System.ComponentModel.DoWorkEventArgs)
'...do stuff
end sub
to this:
Code:
Public Sub FindMyPort()
'...do stuff
end sub
this seems to work. will removing the parameters cause problems later on?
Re: problem with running duplicate threads
Why were those parameters in there in the first place? because you needed to pass data from the BackgroundWorker's DoWork event handler. Given that you're not using a BackgroundWorker anymore...
Re: problem with running duplicate threads
good point :)
thanks all
untill my next thread question lol