|
Hi,
I am trying to run a job that creates a new Thread but I don't know how to pass a value to this thread. I would like to pass a parameter to the TestThread(byval MyVal) Sub but if I try to add MyVal to "Thread(AddressOf testThread(myVal))" I get "AddressOf operand must be the name of a method..."
Here is what I have so far.....
Private Sub Button2_Click(...)
For i As Integer = 0 To 100
pvFile = "D:\Test\" & "test_" & i & ".txt"
Dim t As Thread = New Thread(AddressOf testThread(myVal))
t.Start()
Next
End Sub
Private Sub TestThread(ByVal MyVal as String)
Dim fi As FileInfo = New FileInfo(MyVal)
fi.Create().Close()
End Sub
Any help would be appreciated
thanks,
|
|
|
|
|
It is not possible to pass values to threads.
You can do this:
Private MyVal as String
Private Sub Button2_Click(...)
For i As Integer = 0 To 100
pvFile = "D:\Test\" & "test_" & i & ".txt"
'You pass the value MyVal to a private field
MyVal="what ever"
Dim t As Thread = New Thread(AddressOf testThread)
t.Start()
Next
End Sub
Private Sub TestThread()
Dim fi As FileInfo = New FileInfo(MyVal)
fi.Create().Close()
End Sub
This is the easiest way
|
|
|
|
|
Thanks for responding.
Is there a way to make the "MyVal" private to each thread. I ran it and mutiple threads picked up the same filename which in turned caused an error because threy were trying to access the same file.
Thanks,
|
|
|
|
|
You'll have to encapsulate the threaded code in its own class.
Something like this (untested code):
Imports System
Imports System.Threading
Public Class ThreadWork
Public MaxLoop As Integer
Public Shared Sub DoWork()
Dim i As Integer
For i = 0 To MaxLoop
Console.WriteLine("Working thread...")
Thread.Sleep(100)
Next i
End Sub 'DoWork
End Class 'ThreadWork
Class ThreadTest
Public Shared Sub Main()
Dim i As Integer
For i = 10 To 20
Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork)
Dim myThread As New Thread(myThreadDelegate)
myThread.MaxLoop = i
myThread.Start()
Next i
End Sub 'Main
End Class 'ThreadTest
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Thanks for the sample. I tried it, though, and found that some of the threads were still, in my scenario, trying to access the same file. It works if I set a high enought sleep value.
I opted to pass the filenames at the thread name insteads. This way I do not need a sleep value and no thread would have the same name.
Private Sub btnCreateFile_Click(...)
For i as integer = 1 to 100
TheThread("D:\Test\File_" & i ".txt")
Next
End Sub
Public Shared Function TheThread(ByVal FileName As String)
Dim ThreadCaller As New Thread(New ThreadStart(AddressOf ProcessThread))
ThreadCaller.Name = FileName
ThreadCaller.Start()
End Sub
Private Shared Sub ProcessThread()
File.Create(Thread.CurrentThread.Name).close
End Sub
Do you see any issues with doing it this way? So far it's been working for me.
Thanks,
|
|
|
|
|
Thread names can only be 31 characters long. I hope your design takes this into account...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Do you know of another property of a thread I could set to accomplish the same task without the 31 character limitation?
|
|
|
|
|
I already showed you how to do it.
Using Thread properties to pass parameters is very poor practice.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Is there any one how can give me an idea how to convert a string containing "ToDay()" to the expresion ToDay(). For example:
Dim str as string = "ToDay()"
dim newstr as string = ???str??? 'newstr=9/2/2005
Thanks
|
|
|
|
|
Maybe if you can give a brief explanation of what you are trying to accomplish with this, an answer may be found.
Your example just creates two strings but there's no explanation of what they are for.
|
|
|
|
|
Dear numbrel,
Thank you for your reply. Here is a more detail explanation. The first string contain an expresion, for examble TODAY() or NOW() etc. I am looking a way to use the contents of this string as a vb.net command and give the result to the second string.
I hope this is more clear to you.
Regards zaxos
|
|
|
|
|
zaxos,
It's still not total clear. Maybe if we start at the end.
You want a string containing the result from a function called using the first string.
You can't hard code the function call because....?? Maybe you want to use different functions and you want to use a variable for the function name (the first string is a variable?)
|
|
|
|
|
Yes I want a string containing the result from a function called using the first string. More precicely I dont want the contents of the string
"TODAY()" but the result of the function TODAY().
Regards zaxos
|
|
|
|
|
I still don't understand why you want to use the first string.
Why can't you use:
sResult = Today(), where Today() returns a string and sResult is the variable to hold the second string?
Why do you need to use the first string?
|
|
|
|
|
thank for replying again to my message.
i can't use today() as you suggest because i don't know it.i have for example a textbox in which the user can type anything he wants.So i can't do what you are saying i need to keep in a variable the thing that the user typed and then evaluate that string.i have dim str as string = textbox.text
and i want to use that variable str in order to evaluate that string.
in foxpro i could use what is called macro substitution.so in foxpro i would do something like that dim str1 as string = &str.
i want to do exactly what the debugger does in vb.net when you drop the variable in the watch window it show you the value of the variable.
thanks
|
|
|
|
|
i need to keep in a variable the thing that the user typed and then evaluate that string.i have dim str as string = textbox.text
and i want to use that variable str in order to evaluate that string.
My understanding is that you want to use the input from the user to call a function which would return a string.
If that is correct, my suggestion is to use Select Case.
dim str as string = textbox.text<br />
dim str2 as string<br />
<br />
Select Case str<br />
Case "function1"<br />
str2 = function1()<br />
Case "function2"<br />
str2 = function2()<br />
Case "function3"<br />
str2 = function3()<br />
.<br />
.<br />
.<br />
End Select
Am I close to understanding what you want?
|
|
|
|
|
yes this is what i want to do.
i thought that must be a way not to use something like select case since we don't know the input of the user.i suppose that there is no way in vb.net to do something like the one i described you that we can do in foxpro.
|
|
|
|
|
SQL does this, and I believe VBScript can do it, too. Hopefully, VB.NET doesn't, but it would not surprise me. Is there a command like EXEC, or EXECUTE, perhaps ?
Why would you want to do such a thing ? Basically, you want to take a string, and pass it to the compiler. VB.NET should be able to do this, seeing as .NET compiles on the fly anyhow.
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Thanks for replying to my question.
Can you give me more information about the thing you suggested passing a string to the compiler vb.net in order to evaluate it.Any example or suggestion would be great.
Thanks in advance
|
|
|
|
|
I'm looking into serializing some of my classess to/from XML and need some help.
Imagine the scenario below (these are not my actual classes, but illustrate the problem)...
<br />
<br />
Public Class MyReport<br />
<br />
Public m_Title as String<br />
Public m_BackColor as Color<br />
Public m_Objects as new ArrayList ' Contains MyReportObject objects<br />
<br />
End Class<br />
<br />
Public Class MyReportObject<br />
<br />
Public m_Text as String<br />
Public m_X as Integer<br />
Public m_Y as Integer<br />
<br />
End Class<br />
How do I enable my two classes for serializing ?
I have tried adding different XML attributes to the class members and the Serializable attribute to the classes :
<br />
<br />
<Serializable()> Public Class MyReport<br />
<br />
<Xml.Serialization.XmlAttribute()> Public m_Title as String<br />
<Xml.Serialization.XmlAttribute()> Public m_BackColor as Color<br />
<Xml.Serialization.XmlElement()> Public m_Objects as new ArrayList ' Contains several MyReportObject objects<br />
<br />
End Class<br />
<br />
<Serializable()> Public Class MyReportObject<br />
<br />
<Xml.Serialization.XmlElement()> Public m_Text as String<br />
<Xml.Serialization.XmlElement()> Public m_X as Integer<br />
<Xml.Serialization.XmlElement()> Public m_Y as Integer<br />
<br />
End Class<br />
But I still get an error when I try to serialize the MyReport class ?
What am I doing wrong ?
|
|
|
|
|
Your class isn't attributed Serializable and/or does not implement the ISerializable interface. You can't just tag your classes properties with the attributes you have and expect it to work.
See the ISerializable Interface[^] docs for more information.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Sorry... actually, my classes are marked as serializable :
<br />
<Serializable()> Public Class MyReport<br />
<br />
<xml.Serialization.XmlAttribute()> Public m_Title as String<br />
<xml.Serialization.XmlAttribute()> Public m_BackColor as Color<br />
<xml.Serialization.XmlElement()> Public m_Objects as new ArrayList ' Contains several MyReportObject objects<br />
<br />
End Class<br />
<br />
<Serializable()> Public Class MyReportObject<br />
<br />
<xml.Serialization.XmlElement()> Public m_Text as String<br />
<xml.Serialization.XmlElement()> Public m_X as Integer<br />
<xml.Serialization.XmlElement()> Public m_Y as Integer<br />
<br />
End Class<br />
But somehow my code fails if the m_Objects arraylist contains objects MyReportObject - why ?
I have tried a number of different combinations so the code above isn't 100% accurate, but should give a good idea of what I'm trying to do.
Please help !!
|
|
|
|
|
Sorry for the above post... the forum somehow didn't recognize my account ?!?!?! (grrr!)
Anyway... the two classes ARE marked as < Serializable() > but not shown in the code above (again a forum bug ?)
Here the code AGAIN with the Serializable tags ...
<br />
<br />
< Serializable() > Public Class MyReport<br />
<br />
<xml.Serialization.XmlAttribute()> Public m_Title as String<br />
<xml.Serialization.XmlAttribute()> Public m_BackColor as Color<br />
<xml.Serialization.XmlElement()> Public m_Objects as new ArrayList ' Contains several MyReportObject objects<br />
<br />
End Class<br />
<br />
< Serializable() > Public Class MyReportObject<br />
<br />
<xml.Serialization.XmlElement()> Public m_Text as String<br />
<xml.Serialization.XmlElement()> Public m_X as Integer<br />
<xml.Serialization.XmlElement()> Public m_Y as Integer<br />
<br />
End Class<br />
<br />
|
|
|
|
|
Ok, so it is. It didn't come up before because the < and > brackets weren't typed in correctly. Not beacuse of a bug in CP's code.
Now, what about your serialization code?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Here's the current and complete test source including the test function :
<code>
Imports System.Xml.Serialization
<Serializable()> Public Class MyReport
Public m_Title As String
Public m_BackColor As Color
Public m_Objects As New ArrayList ' Contains several MyReportObject objects
End Class
<Serializable()> Public Class MyReportObject
Public m_Text As String
Public m_X As Integer
Public m_Y As Integer
End Class
Module TestFunctions
Public Sub Test()
' Making test data...
Dim oRep As New MyReport
oRep.m_Title = "Some new report..."
oRep.m_BackColor = oRep.m_BackColor.WhiteSmoke
Dim oObj As New MyReportObject
oObj.m_Text = "A text..."
oObj.m_X = 10
oObj.m_Y = 10
oRep.m_Objects.Add(oObj) ' Leave this line out, and serializeing below will succeed !
Try
' Serialize to XML file...
Dim file As New System.io.FileStream("c:\MyReport.xml", IO.FileMode.Create)
Dim ser As New System.Xml.Serialization.XmlSerializer(oRep.GetType)
ser.Serialize(file, oRep)
ser = Nothing
file.Close()
file = Nothing
MsgBox("Done!")
Catch ex As Exception
MsgBox(ex.Message & vbCr & vbCr & ex.InnerException.Message)
End Try
End Sub
End Module
</code>
|
|
|
|