|
Hi. I'm Mario from Italy.
I've got a problem with timers.
My application has 8 timer. Well my application implements an OCX for Radio Management. The changechannel OCX function has got a problem because (as the manufacturer of the radio told me) the timers suspend the background processes (as changchannel).
Well now I should change the timers, but how can I do it ?
Help me help me !
-- modified at 5:34 Friday 17th March, 2006
|
|
|
|
|
Your question isn't very clear at all. There's a bunch of information missing.
What version of VB are you using? VB6, VB.NET 2002, 2003, 2005?
Your app has 8 Timers in it? What kind of Timers? Forms based??
Timers don't suspend background processes, so I have no idea what he's talking about.
You said your ChangeChannel function has a problem, but you never said what that problem was. You also never said what you need this function to do.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
you're right !
I'm using VB6
My app has 8 forms based timer
The ChangeChannel function changes the channel on the radio.
But when I put this statement in the timer, it doesn't have any effect on the radio.
My app is a really perticulary app.
It's a radiocontrol allarm event management ...
|
|
|
|
|
Forms based Timers do not block background processes or threads from running. The code in the Tick event runs on the same thread as the rest of the UI.
The problem appears to be in the OCX code that changes the channel, but since we have nothing to look at, it's difficult to tell.
What MIGHT be happening is that your making a change to the control, the control is supposed to update somehow, but can't because the thread is busy doing other things in your code. You might want to add a DoEvents() call to the line immediately after your channel change code.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I've a loop (while) just after the the changeChannel function, whit DoEvents.
The while loops until the radio channel has not changed. You see I've a loop, because the channel has not changed.
While radio Channel <> channel request
DoEvents
wend
|
|
|
|
|
Do any one has the idea of tunneling in visual basic 6.0. The basic idea behind this is accessing the restricted websites through proxy server from a client machine
Mangilipelli
|
|
|
|
|
That depends on what you mean by "tunneling through a proxy". Are you asking how to get around the proxies blocked site restrictions? If so, you can't do it, not in any language...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
As i have seen this concept of tunnel in Visual Basic 6.0, one of my colleague has done this but didn't want to mention the API's he has mentioned in his program
Mangilipelli
|
|
|
|
|
Yeah, and he's lying through his teeth.
Since your entire networks only path out to the Internet is through that proxy, there's nothing you can do on your machine to get around that. That is, of course, unless someone left a way around the proxy on your network, or he knows something about your proxy server that he really shouldn't know.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hi Everybody,
I am new to .Net Tech. I just want to know benefits of .Net from Developer point of view and from end user point of view.
Thanks & Regards,
Chandan Kumar
|
|
|
|
|
How about asking Microsoft about it...Visual Studio Developer Center[^]
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
In my application,
I have a listbox to list out the image in a directory,
when the client click the file,
a picture box will display the file by setting the image from the file,
I sure that I have dispose the image and set it to nothing.
But while I system.io.directory.delete(DIRPATH),
Error shown that the file in the directory is using by other application.
How can I track back where is the image still using in my application??
|
|
|
|
|
It's being used by the same Image object that you used to display the image. This is a known "feature" since using Image.FromFile holds the image file open for the lifetime of the Image.
Load your Image into a PictureBox, or whatever, as described in this[^] KB article on MSDN.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
hai
like is there any alternative for this?
suppose i have some 100 buttons and the same functionality when clicking them
usually we write
private sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.click,button2.click,.........
//some code
end sub
so is there any alternative instead of writing button1.click,button2.click,.........button100.click
thanks in advance
|
|
|
|
|
You will have to register the event handler for every button in any case...
Search MSDN for AddHandler
Q:What does the derived class in C# tell to it's parent?
A:All your base are belong to us!
|
|
|
|
|
Hi All,
I have posted this message before as well but i am having trouble coding it the response to my previous post was
Performance will suffer each time you have to go back to the database to get the records you need.
Your best shot is to use a DataView on your DataTable so it returns all the records with at ID.
It's a different View of the table. DataViews can be reconfigured quickly so...
What you'd probably do is
1. retrieve a small table with all the UNIQUE (hint, hint) ID's you're going to use,
2. then retrieve all the records that contain all the ID's you want in a seperate table.
3. Now, you'll iterate through the first table, with the ID's, and use each, one at a time,
to build a DataView on the second table that will return only the records with that ID.
You can then use the data in that DataView to bind to your control.
Dim dv As New DataView(dataTable)With dv
.AllowDelete = False
.AllowEdit = False
.AllowNew = False
.RowFilter = String.Format("ID='{0}'", idToFind)
.Sort = "CompanyName DESC"End With' Bind you control to this DataView
--------
so far i have coded...
**************************
'select the table with only distinct ID based
cmd = New SqlCommand("select distinct measure_id from measuredata m, textdata t where t.ScoreCardId = m.ScoreCardId", objConn)
Dim da As SqlDataAdapter = New SqlDataAdapter(cmd)
Dim dtId As New DataTable("MeasureId")
da.Fill(dtId)
'DataGrid1.DataSource = dtId
'DataGrid1.DataBind()
'select all columns with ID
Dim cmd1 As SqlCommand = New SqlCommand("select * from measureData", objConn)
Dim da1 As SqlDataAdapter = New SqlDataAdapter(cmd1)
Dim dt As New DataTable("MeasureSource")
da1.Fill(dt)
Dim myView As New DataView(dt)
Dim rowview As DataRowView
For Each rowview In
myView.RowFilter = String.Format("ID='{}'", dtId.Columns.Item("measure_Id"))
Next rowview
'DataGrid2.DataSource = dt
'DataGrid2.DataBind()
****************************
now i dont know how to do the 3rd one. Please note. i am not looking for a whole block of data in one go. i need to seperate each chunk of data and bind it to my webcontrol so that based on each ID it will create a web chart.if there is 4 IDs it will create 4 web charts and displayed in page load.
so i will be looking for a each set of data for each ID like
webchartControl1.datasource = dataset(@from ID 1)
webchartControl2.datasource = dataset(@from ID 2) and so forth.
#actualy i also want to instanciate webchartControl too if there is more data avaialble instead of having lots of instances hardcoded. just dont know how to do that.
and hardest bit is
#those all charts are going back in repeater. and those charts are populated in each row based upon their parent ID.
Its a lots of task, I will be really happy if any of you know a software that does those stuff happy to buy one and save time.
many thanks in forward.
robin
|
|
|
|
|
I have noticed in certain instances that updating data in a listview via a thread, is is not reflected in the UI, but the data is changed. The data is updated in a different thread using InvokeRequired ensuring thread safety. Here is a sample application:
Designer:
<global.microsoft.visualbasic.compilerservices.designergenerated()> _
Partial Class Form1
Inherits System.Windows.Forms.Form
'Form overrides dispose to clean up the component list.
<system.diagnostics.debuggernonusercode()> _
Protected 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()
Dim ListViewItem1 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem(New String() {"Account1", "Inbox", ""}, -1)
Dim ListViewItem2 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem(New String() {"Account2", "SentItems", ""}, -1)
Dim ListViewItem3 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem(New String() {"Account3", "Help", ""}, -1)
Dim ListViewItem4 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem(New String() {"Account4", "Save", ""}, -1)
Dim ListViewItem5 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem(New String() {"Account5", "Drafts", ""}, -1)
Me.ListView1 = New System.Windows.Forms.ListView
Me.ColumnHeader1 = New System.Windows.Forms.ColumnHeader
Me.ColumnHeader2 = New System.Windows.Forms.ColumnHeader
Me.ColumnHeader3 = New System.Windows.Forms.ColumnHeader
Me.SuspendLayout()
'
'ListView1
'
Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2, Me.ColumnHeader3})
Me.ListView1.FullRowSelect = True
Me.ListView1.Items.AddRange(New System.Windows.Forms.ListViewItem() {ListViewItem1, ListViewItem2, ListViewItem3, ListViewItem4, ListViewItem5})
Me.ListView1.Location = New System.Drawing.Point(12, 12)
Me.ListView1.Name = "ListView1"
Me.ListView1.Size = New System.Drawing.Size(268, 159)
Me.ListView1.TabIndex = 1
Me.ListView1.UseCompatibleStateImageBehavior = False
Me.ListView1.View = System.Windows.Forms.View.Details
'
'ColumnHeader1
'
Me.ColumnHeader1.Text = "Account"
'
'ColumnHeader2
'
Me.ColumnHeader2.Text = "Folder"
Me.ColumnHeader2.Width = 78
'
'ColumnHeader3
'
Me.ColumnHeader3.Text = "Msg"
Me.ColumnHeader3.Width = 96
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(292, 181)
Me.Controls.Add(Me.ListView1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
Friend WithEvents ListView1 As System.Windows.Forms.ListView
Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader
Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader
Friend WithEvents ColumnHeader3 As System.Windows.Forms.ColumnHeader
End Class
FormCode:
Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.Windows.Forms
Public Class Form1
Delegate Sub lvwCallback(ByVal iIndex As Integer, ByVal [text] As String)
Private lCnt1 As Integer = 0, lCnt2 As Integer = 0, lCnt3 As Integer = 0
Private lMainID As Integer = Thread.CurrentThread.ManagedThreadId
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Test.TestUpdate()
End Sub
Public Sub SetTextLvw(ByVal iIndex As Integer, ByVal [text] As String)
Debug.Print("Main:" & lMainID & "-Current:" & Thread.CurrentThread.ManagedThreadId.ToString & "-Form:" & Me.InvokeRequired & "-" & "ListView:" & Me.InvokeRequired)
If Me.ListView1.InvokeRequired Then
Dim d As New lvwCallback(AddressOf SetTextLvw)
'Me.Invoke(d, New Object() {iIndex, [text]})
Me.ListView1.Invoke(d, New Object() {iIndex, [text]})
Else
Me.ListView1.Items(iIndex).SubItems(2).Text = [text]
Debug.WriteLine("Text:" & ListView1.Items(iIndex).SubItems(0).Text & "-" & ListView1.Items(iIndex).SubItems(2).Text)
Me.ListView1.Update()
Me.ListView1.Refresh()
End If
End Sub
End Class
Public Module Test
Dim lCnt As Integer
Private oTimer As New Timers.Timer(180)
Public Sub TestUpdate()
AddHandler oTimer.Elapsed, AddressOf sTimer
oTimer.Start()
End Sub
Private Sub sTimer(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
lCnt += 1
Form1.SetTextLvw(3, "Timer:" & lCnt)
End Sub
End Module
Can anyone help?
|
|
|
|
|
mechman wrote: Form1.SetTextLvw(3, "Timer:" & lCnt)
From your Form_Load event, you make a call to Test.TestUpdate(). The problem is that this module doesn't have any refernce to an instance of Form1. Right now, your code won't even compile. Forms do not work like they did in VB6. There is no "global" instance of Form1 that everything can see.
This is a quick and dirty hack, mostly because Modules are an outdated concept, but here's a couple of changes that should get this to work:
Public Module Test
Public myForm As Form1
Pricate lCnt As Integer
Private oTimer As New Timers.Timer(180)
Public Sub TestUpdate()
If Not myForm Is Nothing Then
Throw New Exception("You must set the value of myForm before calling TestUpdate!")
Else
AddHandler oTimer.Elapsed, AddressOf sTimer
oTimer.Start()
End If
End Sub
Private Sub sTimer(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
lCnt += 1
myForm.SetTextLvw(3, "Timer:" & lCnt.ToString())
End Sub
End Module
Now, when you start your app, you have to tell this module how to get to Form1.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Test.myForm = Me
Test.TestUpdate()
End Sub
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
My aplogogies, I was trying to consolidate code at the last minute to post my real question...
The point was the listview will not update via a thread using the InvokeRequired...The value is updated if you check it via code, but the UI isn't showing the values...This was a test app to duplicate the scenerio...I have seen this several other times with the listview...I have also seen, if the ListView is not prepopulated with columns and items at design time, the InvokeRequired will not see any items or columns via code...
|
|
|
|
|
Also, if a new thread is created with the Form's class, everything works correctly...
|
|
|
|
|
If this works, then I would suspect that your updating the control from the wrong thread...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
That is the problem, I know I am updating from the wrong thread, but the Invoke, InvokeRequired, etc...do not ackowledge it, so the code continues to update the data, but the UI is wrong. I can verify that it is the wrong thread by using my sample code...You can check to see if the Handle for the listview is created, and it will show it isn't...What I am seeing is very strange behavior that I don't know the workaround. I can't always gurantee my Form's class will update a control, why would you ever need class's, modules, etc. if that was the case? This is why I am posting...
|
|
|
|
|
OK. How about this...
This code assumes you have a form with a Button and a ListView on it...
Private Delegate Sub AddItemToListViewDelegate(ByVal item As String)
Private Delegate Sub ChangeSubItemDelegate(ByVal index As Integer, ByVal item As String)
Private t1 As Thread
Private t2 As Thread
Private Const MAXITEMS As Long = 20
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'AddItems()
ListView1.Items.Clear()
t1 = New Thread(New ThreadStart(AddressOf AddItems))
t1.Start()
Thread.Sleep(100)
t2 = New Thread(New ThreadStart(AddressOf RandomSubItems))
t2.Start()
End Sub
Private Sub AddItemToListView(ByVal item As String)
If ListView1.InvokeRequired Then
Dim d As New AddItemToListViewDelegate(AddressOf AddItemToListView)
Invoke(d, New String() {item})
Else
Dim newItem As New ListViewItem(item)
newItem.SubItems.Add("---")
ListView1.Items.Add(newItem)
Application.DoEvents()
End If
End Sub
Private Sub ChangeSubItem(ByVal index As Integer, ByVal item As String)
Try
If ListView1.InvokeRequired Then
Dim d As New ChangeSubItemDelegate(AddressOf ChangeSubItem)
Invoke(d, New Object() {index, item})
Else
If ListView1.Items.Count > index Then
ListView1.Items(index).SubItems(1).Text = item
Application.DoEvents()
End If
End If
Catch
End Try
End Sub
Private Sub AddItems()
Dim x As Long
While x < MAXITEMS
Try
AddItemToListView(String.Format("Item #{0}", x))
x = x + 1
Catch ex As ThreadAbortException
Exit While
End Try
End While
End Sub
Private Sub RandomSubItems()
Dim RNG As New Random
Dim x As Long
While True
Try
ChangeSubItem(RNG.Next(0, MAXITEMS), RNG.Next(0, 1000).ToString())
Catch ex As ThreadAbortException
Exit While
End Try
' This little sleep has to be in there for some reason.
' The form won't update properly without it!
Thread.Sleep(1)
End While
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If t1 Is Nothing Then
Exit Sub
End If
t1.Abort()
t1.Join()
t2.Abort()
t2.Join()
End Sub
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Now take the RandomSubItems and put it in a new Module or Class (outside of the Form's Class) and try it...the listview will not update via the UI...
|
|
|
|
|
OK. It works fine...
Form1 code:
Private Delegate Sub AddItemToListViewDelegate(ByVal item As String)
Private Delegate Sub ChangeSubItemDelegate(ByVal index As Integer, ByVal item As String)
Private t1 As Thread
Private t2 As Thread
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Module1.myForm = Me
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListView1.Items.Clear()
t1 = New Thread(New ThreadStart(AddressOf AddItems))
t1.Start()
Thread.Sleep(100)
t2 = New Thread(New ThreadStart(AddressOf Module1.RandomSubItems))
t2.Start()
End Sub
Private Sub AddItemToListView(ByVal item As String)
If ListView1.InvokeRequired Then
Dim d As New AddItemToListViewDelegate(AddressOf AddItemToListView)
Invoke(d, New String() {item})
Else
Dim newItem As New ListViewItem(item)
newItem.SubItems.Add("---")
ListView1.Items.Add(newItem)
Application.DoEvents()
End If
End Sub
Public Sub ChangeSubItem(ByVal index As Integer, ByVal item As String)
Try
If ListView1.InvokeRequired Then
Dim d As New ChangeSubItemDelegate(AddressOf ChangeSubItem)
Invoke(d, New Object() {index, item})
Else
If ListView1.Items.Count > index Then
ListView1.Items(index).SubItems(1).Text = item
Application.DoEvents()
End If
End If
Catch
End Try
End Sub
Public Sub AddItems()
Dim x As Long
While x < MAXITEMS
Try
AddItemToListView(String.Format("Item #{0}", x))
x = x + 1
Catch ex As ThreadAbortException
Exit While
End Try
End While
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If t1 Is Nothing Then
Exit Sub
End If
t1.Abort()
t1.Join()
t2.Abort()
t2.Join()
End Sub
Module1 code:
Imports System.Threading
Module Module1
Public myForm As Form1
Public Const MAXITEMS As Long = 20
Public Sub RandomSubItems()
Dim RNG As New Random
Dim x As Long
While True
Try
myForm.ChangeSubItem(RNG.Next(0, MAXITEMS), RNG.Next(0, 1000).ToString())
Catch ex As ThreadAbortException
Exit While
End Try
Thread.Sleep(1)
End While
End Sub
End Module
I never use Modules, ... ever. They're an outdated concept that's around just to be backwards-compatible with VB6 code.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|