webForumDet fria alternativet

Gui:et hänger sig

9 svar · 572 visningar · startad av joxxe

joxxeMedlem sedan okt. 200357 inlägg
#1

Jag har gjort ett simplet SFV checker program nu. De funkar finemang.
Dock har jag ett litet problem, eller ganska stort faktiskt.
Medans den kör crc funktionen på filerna, och detta görs i en loop, så "hänger sig" programmet. Men det går att skriva till terminalen, för den skriver ut "Working" för varje fil. Så jag ser att den arbetar. Men jag vill kunna skriva till det grafiska också. För just nu gör den inte det förs då loopen är klar och programmet inte längre är "hängt".

Här är koden för programmet:
http://pastebin.se/1412

NickemannenMedlem sedan aug. 20003 575 inlägg
#2

Du får ha en tråd som kör din crc check.
På det sättet så finns tråden fortfarande kvar som hanterar gui:t.

joxxeMedlem sedan okt. 200357 inlägg
#3

Hmm okej, jag är rätt ny på C. Hur skulle jag skriva det?
Kan du ge mig ett exempel? Eller tom kanske fixa det i koden? Vorre skit schysst!!

PeWMedlem sedan juni 200010 432 inlägg
#4

Vad är det till för plattform?

pimmeMedlem sedan sep. 20011 086 inlägg
#5

Ser ut att vara GTK/Linux.
De gånger jag behöver göra nånting sånt så brukar jag använda fork() för att köra loopen.
Att köra det i olika trådar är också en möjlighet.

joxxeMedlem sedan okt. 200357 inlägg
#6

det är till linux ja...Gtk :)
kan du förklara hur ja ska använda fork?

PeWMedlem sedan juni 200010 432 inlägg
#7

Första träffen på google: http://www.amparo.net/ce155/fork-ex.html ;)

Aleph_OneMedlem sedan juni 2003372 inlägg
#8

Använder du gtk+ 2.0, kan du lika bra använda trådbiblioteket där också. Det är ganska lättanvänt. Här är ett litet exempel på hur du kan göra..

#include <gtk/gtk.h>

void *crc_check(void *args);

int main (int argc, char **argv) 
{
	g_thread_init(NULL);
	gdk_threads_init();
	
	gdk_threads_enter ();
	g_thread_create(crc_check, NULL, FALSE, NULL);
	gtk_init (&argc, &argv);
	gdk_threads_leave();
	
	int count = 0;
	while(count++ < 10)
	{
		printf("\033[1;31mThread 1\033[0m\n");
		g_usleep(100000);
	}
	
	return 0;
}

void *crc_check(void *args)
{
	int count = 0;
	while(count++ < 10)
	{
		printf("\033[1;32mThread 2\033[0m\n");
		g_usleep(100000);
	}
	
	return 0;
}

http://www.gtk.org/api/2.6/gdk/gdk-Threads.html

joxxeMedlem sedan okt. 200357 inlägg
#9

hmm jag har TYP löst det mer fork() nu istället. Fungerar fint, ena processen sköter guiet och den andra crc checkar, dock kan man ju inte använda X funktioner i båda processerna, så jag måste på något sätt "meddela" huvudprocessen när crcchecken är klart och då skriv ut ny text till guiet. Kan jag göra någon funktion eller liknande som ligger och vänta på att köras, så när tex en global variabel ändras så körs den.

Aleph_OneMedlem sedan juni 2003372 inlägg
#10

Kanske inte det här svaret du var ute efter just nu, men använd trådar, det är så man brukar lösa såna här problem.

131 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)