aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2022-06-06 00:24:13 +0200
committerJohn Ankarström <john@ankarstrom.se>2022-06-06 00:24:13 +0200
commitc50bade7dd390784454e44a54a6bcac515d80531 (patch)
tree95ac44bfbb5d9992212b4d17531e9de5b238314c
parentf9dc17e285b5d3100d3eb6dc80a38a621fafe1ae (diff)
downloadEpisodeBrowser-c50bade7dd390784454e44a54a6bcac515d80531.tar.gz
Add basic threading support.
It is much easier to implement on the Prolog side than on the C side... :-)
-rw-r--r--c/episodelistview.c2
-rw-r--r--c/main.c39
-rw-r--r--c/pl.c20
-rw-r--r--pl/episode_data.pl7
4 files changed, 59 insertions, 9 deletions
diff --git a/c/episodelistview.c b/c/episodelistview.c
index 1fb20e2..a1973f8 100644
--- a/c/episodelistview.c
+++ b/c/episodelistview.c
@@ -401,8 +401,6 @@ ElvUpdate()
_stprintf_s(tszDisp, sizeof(tszDisp), TEXT("%d"), iItem);
SendMessage(HWndStatus, SB_SETTEXT, MAKEWPARAM(1,0), (LPARAM)tszDisp);
- _stprintf_s(tszTotal, sizeof(tszTotal), TEXT("%d"), cEp);
- SendMessage(HWndStatus, SB_SETTEXT, MAKEWPARAM(2,0), (LPARAM)tszTotal);
SendMessage(HElv, WM_SETREDRAW, TRUE, 0);
}
diff --git a/c/main.c b/c/main.c
index 921b391..ef3877a 100644
--- a/c/main.c
+++ b/c/main.c
@@ -6,6 +6,7 @@
#include "resource.h"
#include "defs.h"
+atom_t AThread;
char SzLimitScreenwriter[64] = {0};
HFONT HfNormal;
HFONT HfBold;
@@ -15,6 +16,7 @@ HWND HWnd;
HWND HWndStatus;
int BViewTVOriginal = 1;
int BViewWatched = 1;
+int BThread = 0;
int IDPI = -1;
static int BThemes;
static int CxVScroll;
@@ -203,6 +205,27 @@ WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return ElvHandleNotify(lParam);
}
break;
+ case WM_TIMER:
+ switch (wParam) {
+ case IDT_TIMER:
+ {
+ static int i = 0;
+ if (Pl("episode_data","thread_running","A",AThread)) {
+ i = (i+1)%4;
+ SendMessage(HWndStatus, SB_SETTEXT, MAKEWPARAM(1,0),
+ (LPARAM)(i==0? TEXT("."):
+ i==1? TEXT(".."):
+ i==2? TEXT("..."):
+ TEXT("")));
+ } else {
+ i = 0;
+ KillTimer(hWnd, IDT_TIMER);
+ ElvUpdate();
+ }
+ break;
+ }
+ }
+ break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDM_FILE_EXIT:
@@ -212,12 +235,16 @@ WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
ElvUpdate();
break;
case IDM_FILE_FETCH_DATA:
- Pl("episode_data","update_episode_data","");
- ElvUpdate();
- break;
+ if (BThread) break;
+ Pl("episode_data","thread_create","Sa","update_episode_data",&AThread);
+ goto t;
case IDM_FILE_FETCH_SCREENWRITERS:
- Pl("episode_data","update_screenwriters","");
- ElvUpdate();
+ if (BThread) break;
+ Pl("episode_data","thread_create","Sa","update_screenwriters",&AThread);
+ t: KillTimer(hWnd, IDT_TIMER);
+ SetTimer(hWnd, IDT_TIMER, 500, NULL);
+ SendMessage(HWndStatus, SB_SETTEXT, MAKEWPARAM(1,0), (LPARAM)TEXT("."));
+ BThread = 1;
break;
case IDM_FILE_ABOUT:
DialogBox(
@@ -514,7 +541,7 @@ UpdateLayout()
/* Resize status bar parts. */
{
- int aParts[] = {rc.right-Dpi(100), rc.right-Dpi(50), rc.right};
+ int aParts[] = {rc.right-Dpi(55), rc.right};
SendMessage(HWndStatus, SB_SETPARTS,
(WPARAM)sizeof(aParts), (LPARAM)aParts);
}
diff --git a/c/pl.c b/c/pl.c
index acb6ba3..50f5429 100644
--- a/c/pl.c
+++ b/c/pl.c
@@ -58,6 +58,13 @@ Plpv(term_t t, char *szFmt, va_list vl)
if (!PL_put_integer(t+i, x)) return 0;
break;
}
+ case 'A':
+ {
+ atom_t x;
+ x = va_arg(vl, atom_t);
+ if (!PL_put_atom(t+i, x)) return 0;
+ break;
+ }
case 'S':
{
atom_t a;
@@ -70,6 +77,9 @@ Plpv(term_t t, char *szFmt, va_list vl)
case 'i':
va_arg(vl, int *);
break;
+ case 'a':
+ va_arg(vl, atom_t *);
+ break;
case 's':
va_arg(vl, char **);
break;
@@ -102,6 +112,13 @@ Plgv(term_t t, char *szFmt, va_list vl)
if (!PL_get_integer(t+i, lp)) return 0;
break;
}
+ case 'a':
+ {
+ atom_t *lp;
+ lp = va_arg(vl, atom_t *);
+ if (!PL_get_atom(t+i, lp)) return 0;
+ break;
+ }
case 's':
{
char **lp;
@@ -112,6 +129,9 @@ Plgv(term_t t, char *szFmt, va_list vl)
case 'I':
va_arg(vl, int);
break;
+ case 'A':
+ va_arg(vl, atom_t);
+ break;
case 'S':
va_arg(vl, char *);
break;
diff --git a/pl/episode_data.pl b/pl/episode_data.pl
index f6c599c..167594d 100644
--- a/pl/episode_data.pl
+++ b/pl/episode_data.pl
@@ -5,7 +5,9 @@
episode_count/1,
rate_episode/2,
episode_rating/2,
- tv_original/1]).
+ tv_original/1,
+ thread_running/1,
+ thread_exception/2]).
:- use_module(library(clpfd)).
:- use_module(library(dcg/basics)).
@@ -72,6 +74,9 @@ tv_original(Ep) :- episode_datum(Ep, 'Source', 'TV Original').
absolute_url(R) --> "https://www.detectiveconanworld.com", R.
+thread_running(T) :- thread_property(T, status(running)).
+thread_exception(T, E) :- thread_property(T, status(exception(E))).
+
update_episode_data :-
findall(Ep-Info,
(fetch_episode_info(Ep, Info)),