4,828 baris kode, Win32, dan pelajaran tentang Multi-Threading di Single-Threaded Apartment (STA)

Wohoo, hari ini penasaran udah berapa baris kode sih aku tulis:

01

Oh ya, tool Line Counter buatan mas Rich Newman ini bisa di-download disini.

11,839 nggak semuanya hasil ngetik sendiri, karena 7,011 diantaranya generated :) , walhasil baris yg diketik (termasuk blank lines) = 11,839-7,011 = 4,828 baris kode... hmm angkanya menarik:

  • 4 adalah jumlah gang Armanovus,
  • 8 adalah "wealth / kemakmuran" dalam bahasa Tionghoa,
  • 2 saya anggap multiplier (*maksa),
  • dan 8 kemakmuran lagi.

Jadi 4,828 = dengan 4 gang Armanovus, akan ada proyek yg bikin makmur. Kemudian setelahnya, akan muncul proyek yg bikin 2x lebih makmur...

*halah, mimpi dan maksa :) boleh donk mumpung lagi bulan Ramadhan, dimana waktu yg bagus untuk berdo'a dan berharap...

btw, proyek yg ini under ZeddyLabs, jadi masih single-coder...

---

Menjadi UI Programmer harus tahu Win32

Well, lihat gambar di bawah ini. Kadang kita perlu meniru look-n-feel dari yg sesuatu yg standar, misalkan memunculkan daftar folder dan files a-la Windows Explorer. Dengan menggunakan TreeView dan ListView ternyata tidak cukup, harus main-main dengan Win32 juga.

02

---

Menjadi UI Programmer harus tahu STA

Dari aplikasi diatas, memang kelihatan aplikasi ini mirip program Multi-Threading Downloader / Uploader semacam Internet Download Manager,

  • ketika file masuk Queue, progress bar-nya berwarna kuning dan status-nya "Queued"
  • ketika mulai download/upload, progress-bar-nya berwarna kelap-kelip dan status-nya "Downloading/Uploading"
  • ketika selesai, progress bar-nya berwarna hijau dan status-nya "Finished".
  • ketika terjadi error, progress-bar-nya berwarna merah dan status-nya "Error".

Sehingga yang tahu kapan harus meng-update UI adalah download/upload thread. Nah, kalo pertama kali coding, mungkin bingung dengan error "Cross-thread operation not valid: XXX accessed from a thread other than the thread it was created on."

Intinya aplikasi Winforms (dan juga aplikasi WPF) masih bersifat Single-Threaded Apartment, jadi hanya thread yg bikin UI-lah yg berhak memanggil semua method untuk mengubah tampilan. Kalo ga percaya, baca blog Om Greg dari tim WPF ini deh.

Jadi coding-nya harus begini deh:

#region IFormTransfer Members

private delegate void ITransferInfoHandler(ITransferInfo transfer);
public void Add(ITransferInfo transferInfo)
{
    if (!InvokeRequired)
    {
        listviewTransferHelper.Add(transferInfo);
        return;
    }

    Invoke(new ITransferInfoHandler(Add), transferInfo);
}

public void Update(ITransferInfo transferInfo)
{
    if (!InvokeRequired)
    {
        listviewTransferHelper.Update(transferInfo);
        return;
    }

    Invoke(new ITransferInfoHandler(Update), transferInfo);
}

Kalo di WPF, harus pake Dispatcher.BeginInvoke:

#region IFormTransfer Members

public void Add(ITransferInfo transferInfo)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Background,
            (SendOrPostCallback) delegate 
    {
        listviewTransferHelper.Add(transferInfo);
    }
    , null);
}

Ah, hari ini istirahat coding dulu... ada yg lebih penting, yaitu bikin dokumen project management: kapan harus selesai feature X, Y, Z, etc...

Share this post: | | | |
Published Thursday, September 04, 2008 12:35 PM by zeddy

Comments

# How to Resolve "Unable to read data from the transport connection" Error

Thursday, October 09, 2008 5:03 PM by Z & his Startup

Previously when dealing with Web Service calls, I've discussed on how to resolve the TargetInvocation

Powered by Community Server (Commercial Edition), by Telligent Systems