|
Hi,
I got this chart object on my UI thread called 'm_ChartControl'
I got a method called AddAnnotations that will be run on a new thread in my Form_Load method.
Inside my AddAnnotation method there is a line of code that do this.
Annotation a = m_ChartControl.Charts[0].AnnotationList.CreateAnnotation();
But m_ChartControl.Charts[0].AnnotationList.CreateAnnotation(); is in the UI thread.
How do i create a delegate to put it here?
I have tried this.
private delegate Annotation AddAnnotation();
AddAnnotation addNewAnnotation;
private Annotation CreateAnnotation()
{
return m_ChartControl.Charts[0].AnnotationList.CreateAnnotation();
}
void cAnnotation()
{
this.Invoke(addNewAnnotation);
}
I changed this to
Annotation a = cAnnotation();
and i get this error
Error 18 Cannot implicitly convert type 'void' to 'Manco.Chart.CF.Layout.Annotation'
|
|
|
|
|
Threading in .NET and WinForms[^]
void cAnnotation()
{
AddAnnotation del = new AddAnnotation();
this.Invoke(del);
}
public Annotation()
{
//This function will be referenced and executed on destination form/control
}
|
|
|
|
|
Hi,
I need to tranfer hex values through UART. But the problem is the default ASCII encoding of the SerialPort omits zeroes and such values (mostly below 0x14). What do I change this setting to in order to receive all values from 0-255 through the port? Please Help.
For ex: 0x55, 0x55, 0x00, 0x00, 0x55, 0x55 comes through to the PC C# app as UUUU
Regards,
Karthik
|
|
|
|
|
If you want to send or receive all possible byte values, then your data isn't text, and you should stay away from all text-oriented methods and classes. So the words "ASCII" and "encoding" do not apply, just use the Read() and Write() methods which deal with byte arrays; they'll handle everything (unless you have set DiscardNull to true).
|
|
|
|
|
@gszakacs : That did it! I set SerialPort.DiscardNull = False and I was able to see all the hex values. I was using code from a previous project where I used 50-50 encoding to transmit data.
Thank you!
|
|
|
|
|
I am very new in multithreading. I tried to read some topics but confused with different synchronization techniques used in .net multithreading like Mutex class, semaphore, critical section, event, wait handle and monitor.
Can any body guide me or can we do online conference or is there any in-depth video tutorial in multithreading ?
|
|
|
|
|
you should pick one forum and stick to it.
|
|
|
|
|
Google is your friend.
No... I'm serious... Google really is your friend.
What are - hey! Why are you pointing a gun at me?!
RUN AWAY!!!!
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
Is it possible to write Web Services Applications with Vis 2008 Express edition?
|
|
|
|
|
Hi George,
I haven't used it yet, however there is a separate "Visual Web Developer 2008 Express Edition", next to the C#, C++, VB.NET and SQL Server Express-products.
|
|
|
|
|
Yeah! Tried to install and it says SP1 must be intalled first. Downloaded SP1 and it says will not install on express edition. I have the commercial Vis 2008 coming but just sort of "chafing at the bit" to get started on new project.
|
|
|
|
|
which OS?
I have all VS2008 Express packages installed on Vista-32 which probably is at SP1.
|
|
|
|
|
|
George,
1. I don't know what that thing is your link points to
2. IIRC: For XP you should be at SP3 (SP2 at least) for anything recent
3. I downloaded Visual Studio 2008 long ago from here[^]
Cheers.
|
|
|
|
|
I have XP w/SP3 but when I start my Vis 2008 Express there is no icon for Web Services App's
|
|
|
|
|
electriac wrote: Vis 2008 Express
that does not exist.
There are SEPARATE Express products for C#, C++, VB.NET, SQL and Web Design. See the earlier link.
You can install any subset of them next to each other.
|
|
|
|
|
Quick Q for the interop specialists among us:
I have a COM object written in a VB6 legacy app.
The public method I'm trying to call is something like this in VB6:
Public Function MyFunc(ByRef theDictionary As Dictionary) as Long
' ... do stuff
End Function
The VB6 project has a Reference to "Microsoft Scripting Runtime".
In C#, I've imported this vb6 type w/ the type library importer, and have a reference to "Microsoft Scripting Runtime", ie: Interop.Scripting.dll in my C# project.
When I call this class from C#, like so:
public int CallMyFunc()
{
Vb6Type vbObj = new Vb6TypeClass();
Scripting.Dictionary vbDictionary = new Scripting.DictionaryClass();
...
int retVal = vbObj.MyFunc(ref vbDictionary);
....
}
I end up w/ a compiler error that doesn't make sense to me:
Error 3 Argument '1': cannot convert from 'ref Scripting.Dictionary [c:\...\Interop.Scripting.dll]' to 'ref Scripting.Dictionary []'
Note that it can't convert the variable vbDictionary to an array of Scripting.Dictionary. Intellisense will show the parameter type as "ref Scripting.Dictionary theDictionary", hitting F12 takes me to a function of the imported type that looks like this:
[DispId(1234)]
int MyFunc(ref Dictionary theDictionary);
Any suggestions? I have the source for the VB6 and I'm actaully calling a wrapper which has the same signature. I'm about to create a custom type in vb to wrap this and avoid the drama.
|
|
|
|
|
Wes Jones wrote: Scripting.Dictionary vbDictionary = new Scripting.DictionaryClass();
Do you need to use a DictionaryClass ?
Can you try using just Scripting.Dictionary vbDictionary = new Scripting.Dictionary(); ?
There's nothing left in my right brain and nothing right in my left brain. |
|
|
|
|
|
I have a Visual Studio 2008 Windows Service application that is working wonderfully with 1 exception.
The CPU process shows 49 or 50 percent in Windows Task Manager. I'm sure it is because I have in a Continuous loop, but I'm not sure of the best way to adjust in a service because I do want it to check for files to process continually.
How can I modify to reduce CPU process usage?
Any and all advice welcomed.
Here is a code snippet :
public Service1()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("AppNameLogSource"))
{
System.Diagnostics.EventLog.CreateEventSource("AppNameLogSource", "AppNameLog");
}
eventLog1.Source = "AppNameLogSource";
eventLog1.Log = "AppNameLog";
}
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new AppNameService.Service1() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("AppName Service has started");
var worker = new Thread(AppNameService);
worker.Name = ("AppNameServiceWorker");
worker.IsBackground = false;
worker.Start();
}
protected override void OnStop()
{
eventLog1.WriteEntry("AppName Service has stopped.");
}
protected override void OnContinue()
{
eventLog1.WriteEntry("AppName Service is continuing and working.");
}
void AppNameService()
{
string sRetVal;
string sRetVal2;
string sFileName;
string sImportDir;
string sTypeImportFile;
int iInt1;
int iInt2;
Boolean bolContinueService = true;
sWinDir = System.Environment.GetEnvironmentVariable("windir");
sRetVal = Get_AppSettings((sWinDir + "\\AppNameServiceAppSettings.ini"));
do
{
try
{
sRetVal = Get_AppNameServiceList((sWinDir + sAppNameServiceListName));
Boolean bolCompareValue = false;
bolCompareValue = CompareStrings(sRetVal, "Success");
if (bolCompareValue == true)
{
iInt1 = 0;
do
{
(Run of a Subroutine that looks and sees if there are files to process.
It will set the bolFilesToProcess = True if it finds any files
Or set the bolFilesToProcess = False if there are not.)
if (bolFilesToProcess == true)
{
iInt1 = iNumberOfINIs;
}
}
while (iInt1 < iNumberOfINIs);
if (bolFilesToProcess == true)
{
eventLog1.WriteEntry("Call AppName to process new files found.");
using (System.Diagnostics.Process exeProcess = System.Diagnostics.Process.Start(@sApp2Executable, @"/r"))
{
exeProcess.WaitForExit();
}
eventLog1.WriteEntry("AppName completed processing of files.");
}
}
}
catch (Exception ex)
{
bolContinueService = false;
sErrorMessage = "Error in AppName Service Continuous process Loop. Error: " + ex.Message;
eventLog1.WriteEntry(sErrorMessage, EventLogEntryType.Error);
}
finally
{
GC.Collect();
}
}
while (bolContinueService == true);
eventLog1.WriteEntry("ContinueService Process has stopped due to Internal Service Error. - AppNameService ");
}
modified on Saturday, December 12, 2009 7:47 AM
|
|
|
|
|
50% probably is all CPU power of a dual-core.
I would look into your code if it were posted in PRE tags, preserving indentation.
You could still edit your message to that effect. Thanks.
|
|
|
|
|
I edited the post saving with PRE-Tags to perserve the indentation.
|
|
|
|
|
Thanks for PRE tags.
I'm replying here as this allows me to still see your code while I type.
IMO the problem is this: AppNameService contains one big loop (do ... while bolContinue), which contains some conditional tests. In one path a blocking method (WaitForExit) is called; in all other execution paths (when bolCompareValue is false or when bolFilesToProcess is false), the code never becomes idle, hence uses all available cycles to hurry up and start the next loop iteration.
There are a couple of ways to fix this:
1. the easy one: when nothing needs to be done in an iteration, call Thread.Sleep(100) to relinquisg the CPU for 100 msec, or whatever number that looks fine, but not below 10, as that is about equal to the system's tick resolution (see my Timers article).
2. the more economical one: if possible, make everything event-driven, i.e. don't poll (=check for certain conditions) at all, just tell the party responsible for those conditions to send you a signal. This isn't always possible.
Some additional comments:
1. there is no need to write if (booleanFlag==true) ... , a simple if (booleanFlag) ... behaves identically in C#.
2. in your try block, you are logging the Exception.Message but ignoring all the extra information that may be present in the Exception, and only gets visible by looking at its remaining properties (or easier: by looking at Exception.ToString(); I recommend keeping a log file with all the ToString() results, assuming they would be too much to put into the existing eventLog)
3. I don't like explicit GC.Collect() calls; maybe it is OK or even good in a service, I would certainly ban them from interactive programs.
|
|
|
|
|
Thank you very much for the advice and quick response. I will apply your service suggestion on Monday when I return to work and then reply back with the method that worked. Also thank you for the general C# coding recommendations.
|
|
|
|
|
Option 1 (Thread.Sleep(100);) worked beutifully as Luc Pattyn suggested. Thank you!
}
}
Thread.Sleep(100);
}
catch (Exception ex)
{
bolContinueService = false;
sErrorMessage = "Error in DocumentShuttle Service " + sAssemblyVersion + " Continuous process Loop. Error: " + ex.Message;
sRetStatusErrorLog = WriteInLog(sErrorMessage);
eventLog1.WriteEntry(sErrorMessage, EventLogEntryType.Error);
}
|
|
|
|
|
Anyone knows how to handle the code in chapter 26 from the book "Microsoft Visual C# Step by Step"? This example runs well except for adding a row to the listview control that is biding with the Northwind database, I tryed everything but it seems the problem is the data binding and the listview control that doesn't recognize the format of the table problably because the table is joined with another table and the listview control refers to only one table. I will post the code that gives a the runtime error later.
|
|
|
|