|
Hello all
I was under the impression that if I make a call into a static function which uses the value of a static class variable, if I recall the function later the value of the static class variable would reset back to the default coded value.
Now as the following example prooves I am obviously wrong.
I have a test application/dll that has the following code :
StaticLib.dll
using System;
namespace StaticLib
{
public class MyStaticLib
{
private static int val = 0;
public static int GetNumber()
{
return val++;
}
}
}
Console Application (which references StaticLib.dll)
using System;
using StaticLib;
using System.Threading;
namespace StaticTest
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
while(true)
{
Console.WriteLine(MyStaticLib.GetNumber());
Thread.Sleep(1000);
}
}
}
}
When I ran this for the first time I expected to get the following output
0
0
0
0
0
0
But I actually get
1
2
3
4
5
6
7
Could anybody explain why this is?
post.mode = postmodes.signature;
SELECT everything FROM everywhere WHERE something = something_else;
> 1 Row Returned
> 42
|
|
|
|
|
MrEyes wrote:
I recall the function later the value of the static class variable would reset back to the default coded value.
That is not correct. The value will not reset unless you have code to explicitly reset it.
MrEyes wrote:
Could anybody explain why this is?
That is the correct behaviour. A static is a value that exists for all instances of the class. If some code modifies it then all instances of the class (and any static methods/properties) see the modification.
Some people think of a static that is a global value within the class.
Does this help?
My: Blog | Photos
WDevs.com - Open Source Code Hosting, Blogs, FTP, Mail and More
|
|
|
|
|
This behavious is correct. Static variable has lifetime of global variable but it has a scope of local variable. Hence the value of static variable persists across multiple calls to the function.
Unlike nonstatic members where each instance of object has its own copy of variables, the static variable is shared across all instances i.e. only one copy od static variable is available across all instances of objects.
Ravindra Sadaphule
MCSD.NET
|
|
|
|
|
Hi,
I want to locate the listViewItem when the mouse is dragged over the
listViewItems in a listView. I try to locate which listViewItem is dragged over by the mouse by using the listView.getItemAt(e.X,e.Y) in the dragOver handler, but it can't return the listViewItem located by the mouse(it can return the right x, y of the mouse location)?
Why ?
Many thanks
|
|
|
|
|
Because the GetItemAt method looks at a coordinate local to the control, not the screen (i.e. Point(0, 0) to the control is the upper left corner of the list view, whereas Point(0, 0) to the cursor is the upper left corner of the screen).
Here's some example code that should work for you:
Point localCoordinate = listView.PointToClient(MousePosition);
listView.GetItemAt(localCoordinate.X, localCoordinate.Y);
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: He has a funny face. And he's my son.
Judah Himango
|
|
|
|
|
I have a routine which reads a header record from a file, that header record tells how many subsequent records to read, each record having another header which says how long that record is in bytes.
Is it more efficient to allocate an array of (say) 10,000 bytes at the beginning of the loop which process the records then use:
BinaryReader.Read(buffer,0,reclength);
or is it better to just allocate the bytes required on the fly:
byte[] buffer = BinaryReader.ReadBytes(recLength);
For this example the recLength will never exceed 10,000 but could be anything between 1 and 10,000 - the loop can require between 40 and 200 iterations.
|
|
|
|
|
Especially since this is C#, I would code whichever method is easiest for you and then only worry about it if there is an actual performance problem.
When you get to that point, creating one large buffer will typically go on the large object heap and requires more memory at one time, which might be faster on a single user system with few memory constraints.
Your second approach will use more memory during processing, however it will give the garbage collector a chance to collect already processed buffers.
A third approach is to use the stream directly, one pre-allocated buffer and read the data from the stream into the buffer without any allocations in your loop. This is more difficult especially if the records are not fixed size, but will typically perform the best of all the options since there is no allocation in the loop.
However, your loop needs to be driving an efficient processing operation for optimizing reading to make sense. If you are just creating an array of record objects in your loop for example, these changes won't make much of a difference.
I can imagine the sinking feeling one would have after ordering my book,
only to find a laughably ridiculous theory with demented logic once the book arrives - Mark McCutcheon
|
|
|
|
|
|
Hi,
For developing interop dll in developer's pc, GacUtil and RegAsm is used in dos command prompt environment. But for deploying the dll in customer computers, what should be done ?
Many thanks
|
|
|
|
|
Use your installer program to call gacutil and regasm on your interop files. As long as the end user has .NET runtime installed, they'll have gacutil and regasm.
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: He has a funny face. And he's my son.
Judah Himango
|
|
|
|
|
Use a Windows Installer-compatible installer, such as the Visual Studio deployment project. Instruct the installer to register the assembly and to place it in the GAC.
If you use a Visual Studio deployment project, you can do this by going to the File System view, then right-click in the left-hand pane and choose Add Special Folder > Global Assembly Cache Folder. Drop your assembly into this folder. To register, select the assembly in Solution Explorer or the File System view, then in Properties, set "Register" to "vsdraCOM".
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
hi frds
i m facing problem tht how to get mac address of my system and how can i restrict a packet to use a specific NiC for communication (programmatically)when making my own packet for checking network statistics ............
if any body can plz guide me some soltution
waitng auxiously
bye
|
|
|
|
|
look if you want to deal with device and get what ever info you want. most network devices implements SNMP protocol which allow you to query and gets device info.
SNMP is application layer protocol. so to know device mac address you must implement SNMP class whith your hand which produce an array of bytes whith spesific values that represent SNMP header and your request.then send this array in udp message to device you want to know it's MAC. and when you get response from udp socket which you send msg from. you must get MAC back from the recieved array of bytes
marcoryos
|
|
|
|
|
Keep in mind this will only return the first MAC Address. You can iterate through each adapter to find each of the MAC's
public class Ethernet
{
public static String MacAddress
{
get
{
if (macAddress == null)
{
ManagementClass mc =
new ManagementClass(
"Win32_NetworkAdapterConfiguration");
foreach (ManagementObject mo in mc.GetInstances())
{
if (((bool)mo["IPEnabled"]) == true )
{
String address =
(String)mo["MACAddress"];
if (address.Length != 0)
{
macAddress = address;
break;
}
}
}
}
return macAddress;
}
}
private static String macAddress;
}
-
Drew
|
|
|
|
|
Appdomain.AddPrivatePath("..\otheassemblies\")
I need the assembly loader to look into the otherassemblies directory that is directly above the BaseDirectory of the application, that is
c:\otherassemblies\
c:\myprogram\ <- BaseDirectory
The way I understand I need to tell the AppDomain about this privatepath using the AddPrivatePath method RELATIVE to the BaseDirectory account.
When I run the program it seems like both directories were accepted but the assembly prober doesn't even touch the \otherassemblies\ directory. That is privatepath is being ignored.
I also get the "Policy not being applied referenced."
Guillermo
|
|
|
|
|
The private path needs to be under the base directory.
|
|
|
|
|
Hi!
Im using a custom made doublebuffer transparent control over a mediaplayer-control. I would like to be able to pause the movie and then draw red marker rectangles on the transparent control. I would like to be able to see these rectangles while playing the movie. Everything works fine except for the last part, the rectangles dissappear as soon as I resume the movie. This is a test onPaint method in my transparent control:
protected override void OnPaint(PaintEventArgs e)
{
if(_backBuffer==null)
{
_backBuffer=new Bitmap(this.ClientSize.Width,this.ClientSize.Height);
}
Graphics g=Graphics.FromImage(_backBuffer);
//Copy the back buffer to the screen
e.Graphics.DrawImageUnscaled(_backBuffer,0,0);
// Get the graphics object
Graphics gfx = e.Graphics;
// Create a new pen that we shall use for drawing the line
Pen myPen = new Pen(Color.Red);
// Loop until the coordinates reach 250 (the lower right corner of the form)
for(int i = 0; i < 250; i = i + 50)
{
// Draw a 50x50 pixels rectangle
gfx.DrawRectangle(myPen, i, i, 50, 50);
}
g.Dispose();
gfx.Dispose();
}
Any tips?
THanks for your help
/Rickard
|
|
|
|
|
is the focus transfered to the movie when resuming try transControl.bringToFront()
orit is refreshed ?
ByMindOnlyYouCanDoIt
|
|
|
|
|
Hi!
Thanks for your answer, bringToFront() makes no difference. refresh() does, but only temporary, it seems like i need to refresh the transControl continuously while the movie is playing, and I dont like that solution, also it makes the rectangles flicker.
/Rickard
|
|
|
|
|
try to make the style of the control it self to this
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque,true);
try this,this would make the control paint will be only in the paint OVERRIDED method and the second flag makes its background is the control that is lying behind it as it won't paint its own packground so now u won't need to make tha back color transparent also
ByMindOnlyYouCanDoIt
|
|
|
|
|
No wont work either, unless im doing something wrong, here´s my entire transpanel class:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
public class TransPanel : Panel
{
private Bitmap _backBuffer;
public TransPanel()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque,true);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp=base.CreateParams;
cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
protected void InvalidateEx()
{
if(Parent==null)
return;
Rectangle rc=new Rectangle(this.Location,this.Size);
Parent.Invalidate(rc,true);
}
protected override void OnPaint(PaintEventArgs e)
{
if(_backBuffer==null)
{
_backBuffer=new Bitmap(this.ClientSize.Width,this.ClientSize.Height);
}
Graphics g=Graphics.FromImage(_backBuffer);
//Copy the back buffer to the screen
e.Graphics.DrawImageUnscaled(_backBuffer,0,0);
Font fnt = new Font("Verdana", 16);
Graphics gf = e.Graphics;
gf.DrawString("GDI+ World", fnt, new SolidBrush(Color.Red), 14,10);
g.Dispose();
//base.OnPaint (e); //optional but not recommended
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
//do not allow the background to be painted
}
protected override void OnSizeChanged(EventArgs e)
{
if(_backBuffer!=null)
{
_backBuffer.Dispose();
_backBuffer=null;
}
base.OnSizeChanged (e);
}
}
|
|
|
|
|
The last thing that you can try is to make another thread to the control to draw in and don't make that in the paint method and use thread timers to make it infinite or as u wish u can make it as the lenght of the vedio in this method u cac write
private void drawingMethod(object o)
{
//make this call at all the first
this.BringToFront();
//and then call it agai and again (but in a separate thread)//the timer will make this separate thread for u or u can make an instance of the thread class ex. Thread urThread = new Thread(new ThreadStart(medothname));
}
ByMindOnlyYouCanDoIt
|
|
|
|
|
It would seem that the Media Player is overwriting your boxes on top of it. This would be because the video that Media Player paints is being repainted, after your boxes are painted, with every frame of video. In other words, your constantly being painted over by the Media Player. I don't think your going to be able to get around this little problem considering Media Player paints (I think!) directly to the frame buffer, but I could be wrong.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
With this set:
CreateParams cp=base.CreateParams;
cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
You need to determine when to redraw the control. Windows will not let you know. Other then a timer constantly repainting you controls, I see only one .Net way. Remove your CreateParams for the control and use a custom shape to do what you want. Simply create a control that is a box with no center. I will try to upload an example in a few.
|
|
|
|
|