|
Unfortunately this does not work in all cases and is not guaranteed to work in future versions of the framework. See Mike Stall's blog [^]for more info.
The question one should be asking is "why does the constructor need to know the declaring type of its calling method?"
|
|
|
|
|
Thanks, I didn't know that. Ya, if the question is unavoidable, I suppose passing the result of this.GetType() to the constructor is nice and clear about what is going on.
|
|
|
|
|
Hi everybody.
Is it allowed to mix lock and Monitor.TryEnter commands on the same locking object? I think that lock is implemented using Monitor.Enter and Monitor.Exit - so there should be no problems. Am I correct?
Thanks
Uros
|
|
|
|
|
Yes, lock is expanded by the compiler to Monitor.Enter /Monitor.Exit , so
lock (obj)
{
} gets expanded to
Monitor.Enter(obj);
try
{
}
finally
{
Monitor.Exit(obj);
} I'm not sure how you would mix the Monitor.TryEnter with using a lock on the same object since you would then be acquiring two locks on the same object.
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
[ Forum Guidelines][ Articles][ Blog]
|
|
|
|
|
Thanks for your reply! I'm am not using lock all the time becouse I need the time out functionality of the Monitor.TryEnter. I hade in mind something like that:
private void doSomething()
{
lock(_locker)
{
//Do something here
}
}
private void doSomethingElse()
{
bool lockAquired = Monitor.TryEnter(_locker, 100)
if(lockAquired)
{
//Do something else
Monitor.Exit(_locker);
}
}
Is that OK?.
|
|
|
|
|
That should be fine. The only thing you should change in your doSomethingElse method is that it should be wrapped in a try/finally block like this:
private void doSomethingElse()
{
bool lockAquired = Monitor.TryEnter(_locker, 100);
try
{
if(lockAquired)
{
}
}
finally
{
Monitor.Exit(_locker);
}
} This way, if something fails and throws an exception while you have the lock acquired, you will be sure to release it and minimize the chance of a deadlock condition.
You might also want to take a look at the following blog post from Ian Griffiths: http://www.interact-sw.co.uk/iangblog/2004/04/26/yetmoretimedlocking[^] (the site appears to be down at the moment, but it should be back up soon, hopefully.
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
[ Forum Guidelines][ Articles][ Blog]
|
|
|
|
|
I'll do that. Thanks again for all your help.
Uros
|
|
|
|
|
I wrote some class that inherit from the class TextBox - and i try to override the method OnKeyPress.
What i try to do is make the control valid only for digit.
So I check the argument that my method gets and live the text as it was before OnKeyPress call in case the argument is not digit.
I see actualy that even the fact that my OnKeyPress calls - the char that is not digit gets into the contol.
The code :
protected override void OnKeyPress(KeyPressEventArgs e)
{
string strBefore = Text;
if (char.IsDigit(e.KeyChar))
{
....
}
}
p.s - i also override the method OnkeyUP and OnkeyDown - and nothing helps.
|
|
|
|
|
Hi,
the Control will continue to process its inputs in the normal way, unless you set e.Handled=true;
|
|
|
|
|
The code :
protected override void OnKeyPress(KeyPressEventArgs e)
{
string strBefore = Text;
if (char.IsDigit(e.KeyChar))
{
....
}
}
I'm not sure... But try It out.....My compiler is not working.....
Try Using This code :
protected override void OnKeyPress(KeyPressEventArgs e)
{
string strBefore = Text;
if (char.IsDigit(e.KeyInt))
{
// The char Data Type gives u the problem or error
// The int data type has to give only the digit as input....
}
}
|
|
|
|
|
PRAVEEN@IT2008 wrote: I'm not sure... But try It out.....My compiler is not working...
If you don't have access to a compiler, you should at least take a look at the documentation intead of just guessing wildly...
There is no KeyInt property in the class.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
I have the following code. I've install the service, and start it. I want to create a file 'c:\test.txt' using the timer. But the file still can't be created. I've check for Application error at windows 'event viewer', but have not find any.
using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.IO;
namespace WindowsService
{
class WindowsService : ServiceBase
{
private System.Windows.Forms.Timer timer1;
private System.ComponentModel.IContainer components;
public WindowsService()
{
this.ServiceName = "G-ERP Auto backup";
this.EventLog.Source = "G-ERP Auto backup";
this.EventLog.Log = "Application";
this.CanHandlePowerEvent = true;
this.CanHandleSessionChangeEvent = true;
this.CanPauseAndContinue = true;
this.CanShutdown = true;
this.CanStop = true;
InitializeComponent();
if (!EventLog.SourceExists("G-ERP Auto backup"))
EventLog.CreateEventSource("G-ERP Auto backup", "Application");
}
static void Main()
{
ServiceBase.Run(new WindowsService());
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
protected override void OnStart(string[] args)
{
this.timer1.Enabled = true;
base.OnStart(args);
}
protected override void OnStop()
{
this.timer1.Enabled = false;
base.OnStop();
}
protected override void OnPause()
{
this.timer1.Enabled = false;
base.OnPause();
}
protected override void OnContinue()
{
this.timer1.Enabled = true;
base.OnContinue();
}
protected override void OnShutdown()
{
base.OnShutdown();
}
protected override void OnCustomCommand(int command)
{
base.OnCustomCommand(command);
}
protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
{
return base.OnPowerEvent(powerStatus);
}
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
base.OnSessionChange(changeDescription);
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
}
private void timer1_Tick(object sender, EventArgs e)
{
File.Copy(@"c:\YServer.txt", @"c:\test.txt");
if (!File.Exists(@"c:\YServer.txt"))
{
File.Copy(@"c:\YServer.txt", @"c:\test.txt");
}
}
}
}
|
|
|
|
|
Yulianto. wrote:
File.Copy(@"c:\YServer.txt", @"c:\test.txt");
if (!File.Exists(@"c:\YServer.txt"))
{
File.Copy(@"c:\YServer.txt", @"c:\test.txt");
}
File.Copy(@"c:\YServer.txt", @"c:\test.txt");
if (!File.Exists(@"c:\YServer.txt"))
{
File.Copy(@"c:\test.txt",@"c:\YServer.txt");
}
Check the difference on the bold line
Bob
Ashfield Consultants Ltd
|
|
|
|
|
Thanks. But i did not solve the problem
|
|
|
|
|
Hi,
I made this code based on some code i made in delphi, but it always fires the wrong keys. The bytes are right (I debugged and I saw its ok)
public static void SetActiveControlText(string text)
{
byte[] buffer = Encoding.ASCII.GetBytes(text);
for (int i = 0; i < buffer.Length; i++)
{
keybd_event(buffer[i], 0x45, 0x01, 0);
keybd_event(buffer[i], 0x45, 0x01 | 0x02, 0);
}
}
Any ideas what could possibily be wrong? the text I'm sending is "dirso" and the current application (notepad) start wrint "491/-1/-1" Ctrl+R and so on.
Thanks,
Dirso.
|
|
|
|
|
Hi!
Take a look at the documentation for keybd_event:
http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx[^]
You're always giving 0x45 as second parameter (hardcoded - yuck!) instead of the scancode and the third parameter also doesn't seem right. Read the documentation and correct your code appropriately.
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
Hi,
I still can't find my error. When I first did it, it was in Delphi and it worked fine and also every sample I see looks like this.
Code in Delphi:
procedure TForm1.EnviaChar(c: char);
begin
keybd_event(ord(c),0,0,0);
keybd_event(ord(c),0,KEYEVENTF_KEYUP,0);
end;
I used the 0x45 because the samples have it, but I also tried "0" as the second parameter. and KEYEVENTF_KEYUP is 0x02
I hope you cn help me a little more.
Thanks,
Dirso
|
|
|
|
|
0x45 is used in the sample because it's the scancode for NUMLOCK. Don't just copy&paste samples - try to understand them and modify them according to your needs.
You should take a look at MapVirtualKey() to convert a virtual key into a scancode.
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
Hi,
I actually thought that parameter didn't matter, since I zeroed it in Delphi and it worked like a charm. I also tried to use 0x45, since 0 didn't work in C# and I found a few samples sending text with 0x45 (not just NUM_LOCK).
Anyway, I did what you told me to and I still have the same result.
Here is my C# code (I can't see why it's not working)
private const int KEYEVENTF_KEYUP = 0x02;
private const int KEYEVENTF_EXTENDEDKEY = 0x01;
private const uint MAPVK_VK_TO_VSC = 0x00;
public static void SetActiveControlText(string text)
{
#if(WINDOWS)
byte[] buffer = Encoding.ASCII.GetBytes(text);
uint scanCode;
for (int i = 0; i < buffer.Length; i++)
{
scanCode = MapVirtualKey((uint)buffer[i], 0);
keybd_event(buffer[i], (byte)scanCode, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(buffer[i], (byte)scanCode, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
#else
throw new NotImplementedException()
#endif
}
And here is my Delphi (working very nice) code:
procedure TForm1.EnviaChar(c: char);
begin
keybd_event(ord(c),0,0,0);
keybd_event(ord(c),0,KEYEVENTF_KEYUP,0);
end;
Thanks again,
Dirso
|
|
|
|
|
Hi!
The basic call to keybd_event seems to be OK now, the problem lies in the the way you try to convert your keys to bytes. For example, if you want to send "a" using keybd_event, you'll have to give 41 as virtual key code (there's a complete list of VK codes on MSDN).
But you're using 97 (the ASCII code for "a"), so this cannot work.
Btw. why do you insist on using keybd_event? I suggested using SendKeys.SendWait() a while ago - did you try this?
Regards,
mav
--
Black holes are the places where God divided by 0...
|
|
|
|
|
That's what i was looking for!! I cross plataform solution!!
Thank you so much!
Dirso
|
|
|
|
|
I have the following code:
#region Make all menustrip visible
foreach (ToolStripMenuItem menuItem in menuStrip.Items)
{
menuItem.Visible = true;
foreach (ToolStripItem toolStripItem in menuItem.DropDownItems)
{
toolStripItem.Visible = true;
}
}
#endregion
Why can't I change the toolStripItem Visible to true?
I did not catch any VisibleChanged for the toolStripItem .
|
|
|
|
|
General suggestion for similar situation : try to trace the code,is the loop even activated? - where you call the code aren't you change the visibility after this code - check the parent's visibility more carefully - in the past I've seen some situation that VS did not recognize the changes, mostly changes by designer,...
|
|
|
|
|
Hi, I am a longtime embedded C programmer who has recently begun struggling with OOP
I'm writing code for a serial communication protocol; protocol messages can belong to 2 different types (commands and responses), which share several fields and methods that I decided to factor out in a common base class, more or less like the example below:
public abstract class Message
{
private byte _FieldA;
public byte FieldA
{
}
private byte _FieldB;
public byte FieldB
{
}
private byte _FieldC;
public byte FieldC
{
}
public byte[] CompileHeader()
{
}
}
public abstract class Command : Message
{
}
public abstract class Response : Message
{
}
public class MyCommand : Command
{
}
Message, Command and Response are abstract because they are not meant to be instantiated: it only makes sense to instantiate the concrete subclass (MyCommand).
The problem is: as you see, if the actual message is a Command or a Response, FieldB must be set to a different value. However, FieldB is also used by the base Message class so I cannot move it down the hierarchy.
I'd like FieldB to be set automatically to the appropriate value in my concrete classes, depending on the base class (e.g. if I inherit from Command I'd expect FieldB = 1).
How can I implement this behaviour in C#?
Thanks in advance to all of you gurus out there!
Andrea
|
|
|
|
|
In your abstract class Message class you can do this:
public byte FieldB
{
get { return 1; }
}
And in your abstract class Response something like this:
public new byte FieldB
{
get { return 2; }
}
regards
modified 12-Sep-18 21:01pm.
|
|
|
|