On Thu, January 14, 2010 01:12, JM wrote:
> Hi Łukas
> Thanks for your reply! This somehow does not work as soon as I add
> another thread.
>
> class HHH : Object {
>         private ThreadFunc f;
>         public void run() {
>                 string test = "test";
>                 try {
>                         f = ()=> { print("in thread : %s \n", test); };

When you call this second time, you *replace* the closure created the
first time around, causing it to be deleted. Than it's memory probably
gets reused when creating the thread (in the first post you didn't do
any allocation after the thread was created, so there was nothing to
overwrite the data), causing the first thread to fail.

You need to have one variable for each closure you create, or a collection
of them. Note, that delegates are not compatible with generics, but you can
wrap them in class instances and those are. I don't know whether explicit
boxing (append ? to the type - does the trick with double and struct types)
is supported for delegates or not.

>                         Thread.create(f, false);
>                 }
>                 catch(GLib.ThreadError e) {
>                         print("%s", e.message);
>                 }
>         }
>
>         public static MainLoop loop;
>
>         public static int main() {
>                 loop = new MainLoop(null, false);
>                 var h = new HHH();
>                 h.run();
>                 h.run(); // Another thread
>                 loop.run();
>                 return 0;
>         }
> }
>
> // valac --thread hhh.vala
>
> I get:
>
> $./hhh
> in thread : test
> in thread : (null)
>
> Ideas?
> Regards,
> JĂśrn

-- 
                                        - Jan Hudec <b...@ucw.cz>

_______________________________________________
Vala-list mailing list
Vala-list@gnome.org
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to