[ Neznalica_sa_ugla @ 28.05.2008. 11:25 ] @
Imam nekolio tredova ,jedan od njih trebao bih brojati klikove , bez obzira na kojoj se formi dogodio. (Do sada sam imao brojac u SVAKOJ formi i prilikom klika bi ga povecao to mi se cini traljavo rijesenje )
Da li postoji neko bolje rijesenje. Aplikacija je u C# ,ne web .HVALA
[ DarkMan @ 28.05.2008. 12:01 ] @
Ja bi ti preporucio da za brojanje koristis jedno mesto tj. jednu istu klasu. Nju mozes realizovati preko static promenljivih/metoda ili preko Singleton sablona.

Code:

    public class StaticExample
    {
        private static int _counter = 0;
        public static int Counter
        {
            get { return _counter; }
            set { _counter = value; }
        }
    }


Code:

    public class SingletonExample
    {
        private static SingletonExample _instance = new SingletonExample();

        public static SingletonExample Instance
        {
            get { return _instance; }
        }

        private SingletonExample()
        {
        }

        private int _counter = 0;
        public int Counter
        {
            get { return _counter; }
            set { _counter = value; }
        }
    }


A ovako ih koristis:
Code:

SingletonExample.Instance.Counter++;
StaticExample.Counter++;
[ deerbeer @ 28.05.2008. 12:17 ] @
Citat:

Nju mozes realizovati preko static promenljivih/metoda ili preko Singleton sablona.

Static promenljive nisu thread-safe ...
a pomenuti Singleton sablon ni on nije thread-safe posto nema thread-lock-ova nad objektom.
Code:

public class Singleton
{

     static Singleton instance = null;
     static readonly object padlock = new object();

     Singleton()
     {
     }

     public static Singleton Instance
     {
         get
          {
             lock (padlock) // lock varijable sa exclusive pristup za pojedinacni thread 
              {
                  if (instance == null)
                  {
                       instance = new Singleton();
                  }
                    return instance;
                }
           }
     }
      
}
[ jablan @ 28.05.2008. 12:27 ] @
Nek ti svaka forma nasleđuje tvoju osnovnu klasu za forme koja će brojati klikove.
[ deerbeer @ 28.05.2008. 13:36 ] @
Cini mi se da resenje sa brojanjem klikova i nije bas najsigurnije ...
Thread mora svaki put (u nekom vremenskom intervalu)
da proverava taj brojac tj. counter u formi i na osnovu njega da detektuje klik
sto moze dovesti dovesti da ga ne detektuje u pravom trenutku (sve zavisi od intervala)

Jedino sto mi sada pada napamet je koriscenje P/Invoke funkcija iz WIN32 API -ija

Code:

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public POINT(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}
[StructLayout(LayoutKind.Sequential)]
public struct MSG
{
    public IntPtr hwnd;
    public UInt32 message;
    public IntPtr wParam;
    public IntPtr lParam;
    public UInt32 time;
    public POINT pt;
}

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PeekMessage(out MSG lpMsg, HandleRef hWnd, uint wMsgFilterMin,
   uint wMsgFilterMax, uint wRemoveMsg);


[DllImport("user32.dll")]
static extern bool PostThreadMessage(uint idThread, uint Msg, UIntPtr wParam,
   IntPtr lParam);


// u tvom Button Click handler-u : 
const int BUTTON_CLICK = 2000 ; //poruka koju saljes tvom thread-u 
// ID treada kome hoces da saljes poruku 
int nIDthread  = thread.ManagedThreadId ; 
PostThreadMessage(nIDThread,BUTTON_CLICK,IntPtr.Zero,IntPtr.Zero) ; 

// u tvojoj Thread proceduri : 
MSG msg ; 
bool foundMessage = PeekMessage(out msg, IntPtr.Zero, 0, 0, 0); // da li imamo poruku u thread-u 
if (foundMessage) // imamo poruku u thread-u 
{
 if (msg.message == BUTTON_CLICK) // proveravamo o kojoj se poruci radi ... 
 {
     MessageBox.Show("kliknuto dugme na formi") ;  

 }

}
   


Nije bas elegantno resenje ... al mozda ti pomogne u ovom slucaju ...


[ Neznalica_sa_ugla @ 28.05.2008. 14:40 ] @
Zahvaljujem svima koji su ucestovali , posebno mi se svidja rjesenje od <<deerbeer >> ,ali da l' je moguce ne pratiti to kroz aplikaciju , nego procitati iz sami WINDOWS-a , kada i gde je kliknuo mis, to procitati u thread -u i obraditi . hvala
[ deerbeer @ 28.05.2008. 14:46 ] @
Citat:
Neznalica_sa_ugla: Zahvaljujem svima koji su ucestovali , posebno mi se svidja rjesenje od <<deerbeer >> ,ali da l' je moguce ne pratiti to kroz aplikaciju , nego procitati iz sami WINDOWS-a , kada i gde je kliknuo mis, to procitati u thread -u i obraditi . hvala


Mozes,al cisto sumnjam da ces moci to u .NET-u
Postoje mehanizmi na WINDOWs-u koji ti omogucavaju da pratis Mouse evente na sistemu ..
i to se radi kroz MouseHook DLL -ove ali onda moras to da odradis u C++ -u

[ mmix @ 29.05.2008. 13:50 ] @

Malo je offtopic posto singlton nije prihvacen kao resenje, ali samo da napomenem da locking koji si napravio u ovom primeru ne funkcionise, da bi singlton bio thread-safe lockovi moraju da se stave na static i instance operacijama singletona, ne samo na instance get accessor. Ovime sprecavas da dva thread-a u isto vreme dodju do instance singletona ali ih nista ne sprecava da se kad jednom dodju do reference ne sudare u nekoj od metoda. Takodje generisanje instance singletona mozes da ostavis u class initializer-u i da lockovanje radis kroz lock(instance)/lock(this) u zavisnosti da li je metod staticki/instance.

Citat:
deerbeer: Static promenljive nisu thread-safe ...
a pomenuti Singleton sablon ni on nije thread-safe posto nema thread-lock-ova nad objektom.
Code:

public class Singleton
{

     static Singleton instance = null;
     static readonly object padlock = new object();
...