public MovieSource source;
private MovieFilter filter;
public bool update_running { get; set; }
- private weak Thread thread;
private Cancellable cancellable;
construct {
public bool start_search (MovieFilter _filter) {
if (update_running) {
- stdout.printf ("aborting search thread (%p)...\n", thread);
+ stdout.printf ("aborting search ...\n");
cancellable.cancel ();
// poster_factory.clear_queue ();
- thread.join ();
- stdout.printf ("search thread aborted\n");
+ return false;
}
if (cancellable == null || cancellable.is_cancelled ())
cancellable = new Cancellable ();
filter = _filter;
- try {
- thread = Thread.create (search_thread, true);
- update_running = true;
- } catch (ThreadError e) {
- warning ("Failed to start search thread: %s", e.message);
- }
- return update_running;
+ stdout.printf ("begin search\n");
+ search_async.begin ();
+ update_running = true;
+ return true;
}
- // Update thread
- private void* search_thread () {
- stdout.printf ("search thread started: \"%s\"\n", filter.title);
+ // Asynchronous update method
+ private async void search_async () {
+ stdout.printf ("search started: \"%s\"\n", filter.title);
- Gdk.threads_enter ();
clear ();
- Gdk.threads_leave ();
if (source != null)
// FIXME - arbitrary limit
- source.get_movies (filter, receive_movie, 100, cancellable);
+ yield source.get_movies (filter, receive_movie, 100, cancellable);
- Gdk.threads_enter ();
update_running = false;
- Gdk.threads_leave ();
-
- stdout.printf ("search thread stopped\n");
- return null;
+ if (cancellable.is_cancelled ()) {
+ stdout.printf ("search aborted, starting new\n");
+ cancellable.reset ();
+ if (cancellable.is_cancelled ()) {
+ stdout.printf ("OW WEY\n");
+ }
+ start_search (filter);
+ } else {
+ stdout.printf ("search stopped\n");
+ }
}
private void receive_movie (Movie movie) {
if (cancellable.is_cancelled ())
return;
- Gdk.threads_enter ();
add (movie, out iter);
- Gdk.threads_leave ();
}
// Implement TreeModel interface