Monthly Archives: March 2007

Alpinet reloaded

Cateva “mici” modificari si optimizari care au luat o duminica intreaga, si o schimbare de layout, ca sa mai scuturam praful de acu’ 7 ani: alpinet.org .

 Dat fiind ca site-ul ruleaza deja de aproape 2 ani pe un P4/ 2.8 Ghz (ce-i drept, cu HT) si executa circa 30-40 de query-uri SQL pe secunda, s-au impus cateva modificari in sistemul de caching al paginilor.

 O alta modificare s-a facut la dimensiunea maxima a fotografiilor acceptate, de la max. 600 px la 800 px, si de la 100 KB la 256 KB.

 Am integrat si un meniu DHTML pentru accesul mai facil la informatie (wow) 🙂

 

Cross-Thread invoke helper

Probabil cei care programeaza in .NET forms de ceva vreme se lovesc frecvent de problema invocarii unei metode a unui control, dintr-un thread altul decat cel care este owner-ul controlului. Nu intru in detaliile problemei, care coboara destul de jos la cozi de mesaje per thread, handle-uri windows si altele;

Solutia cel mai des intalnita este: se face un delegate cu semnatura metodei de invocat, se verifica daca este contextul threadului corect cu Control.IsInvokeRequired, si daca nu, atunci se apeleaza metoda prin Control.Invoke, cu delegate-ul definit anterior.

In timp devine “obositor” si mai ales la proiecte mari, definitia cate unui delegate pentru fiecare metoda posibila. O solutie la “oboseala” ar putea fi urmatoarea (mai putin cateva try – catch blocks 😉 :

class CrossThreadHelper
{
    private delegate Object CallMethodProxyDelegate(Control ctrl, String strMethod, object[] arguments);

    private static Object CallMethodProxy(Control ctrl, String strMethod, object[] arguments)
    {
        MethodInfo method;
        method = ctrl.GetType().GetMethod(strMethod);
        return method.Invoke(arguments);
    }

    public static Object CallMethod(Control ctrl, String strMethod, params object[] arguments)
    {
        if(ctrl.InvokeRequired)
        {
             Delegate = new CallMethodProxyDelegate(CallMethodProxy);
             Object[] newArgs = new Object[3];
             newArgs[0] = ctrl;
             newArgs[1] = strMethod;
             newArgs[2] = arguments;
             return ctrl.Invoke(del, newArgs);
         }

         return CallMethodProxy(ctrl, strMethod, arguments);
    }

}

Exemplu:

CrossThreadHelper.CallMethod(this.frmProgress, “Close”);

Â