2014-12-30, 06:18
  #1
Medlem
your_kings avatar
Hejsan!

Har ett problem som är frustrerande, jag skickar in bilder från en databas in i en tablelayout och när jag klickar på nästa sida så fryser sig programmet tills bilderna är laddade.

Här är kod som är relevant till vad jag håller på med.

[PHP]

private void listEx()
{
int p = (page * 20);

MySqlCommand mc = new MySqlCommand("SELECT", myConn);

MySqlDataReader reader;

myConn.Open();

reader = mc.ExecuteReader();

int column = 0;
int row = 0;
string id = "";

if (!init_layout)
init_layout(5, 4);

SendMessage(Layout.Handle, WM_SETREDRAW, false, 0);

while (reader.Read())
{
id = reader.GetString(0);

image = new PictureBox();
image.Name = id;
image.Image = LoadImage(reader.GetString(1));
image.Dock = DockStyle.Fill;
image.SizeMode = PictureBoxSizeMode.StretchImage;
image.BringToFront();

Layout.Controls.Add(image, column, row);

column++;

if (column == 5)
{
column = 0;
row++;
}
}

SendMessage(Layout.Handle, WM_SETREDRAW, true, 0);

Layout.Refresh();

foreach(Control pic in Layout.Controls)
{
pic.Click += delegate(object sender, EventArgs e)
{ view(this, null, pic.Name); };
}

myConn.Close();
}

private Image LoadImage(string url)
{
System.Net.WebRequest request =
System.Net.WebRequest.Create(url);

System.Net.WebResponse response = request.GetResponse();
System.IO.Stream responseStream =
response.GetResponseStream();

Bitmap bmp = new Bitmap(responseStream);

responseStream.Dispose();

return bmp;
}
[/PHP]

Saken är den att jag vill ha en gif som visar att den laddar, men den fryser ju också så att den står stilla tills programmet är responsivt igen.
Citera
2014-12-30, 08:11
  #2
Medlem
Du måste jobba med trådar... Googla "splash screen c#" så bör du hitta rätt lätta tutorials att följa.
Citera
2014-12-30, 09:36
  #3
Medlem
your_kings avatar
Citat:
Ursprungligen postat av fakenich
Du måste jobba med trådar... Googla "splash screen c#" så bör du hitta rätt lätta tutorials att följa.

Tack för svaret, har kollat lite på backgroundWorkers men verkar inte fungera.

Skall googla vidare!
Citera
2014-12-31, 18:51
  #4
Medlem
your_kings avatar
Någon som kan hjälpa mig med detta?

Alternativt utöka fakenich svar och peka mig i rätt riktning?

Fattar inte svaret, får inte fram något som är relevant i google sökning.

Skall jag skapa en ny klass och hämta därifrån?

För testade det och fick samma freeze effekt.

Testade backgroundworker och fick inte min pic.Click att fungera då.
Citera
2015-01-01, 20:43
  #5
Medlem
krysvacs avatar
Citat:
Ursprungligen postat av your_king
Någon som kan hjälpa mig med detta?

Alternativt utöka fakenich svar och peka mig i rätt riktning?

Fattar inte svaret, får inte fram något som är relevant i google sökning.

Skall jag skapa en ny klass och hämta därifrån?

För testade det och fick samma freeze effekt.

Testade backgroundworker och fick inte min pic.Click att fungera då.

Det fakeinch pratar om är att du ska köra ditt ui (grafiska delen) på en så kallad tråd, och det som tar mycket tid, alltså när du hämtar data, på en annan tråd.

Trådar kan beskrivas som personer, normalt så har du en tråd som gör allt. Tråden visar grafiken och den hämtar informationen, men det gör i sin tur att den bara kan göra en sak i taget, så när den här tråden börjar hämta information så fryser sig programmet för att den slutar rita grafiken då den hämtar informationen eftersom den bara kan göra en sak i taget.

Skulle du däremot ha två trådar, då har du helt plötsligt en tråd som konstant uppdaterar grafiken och en som hämtar information. Och då fryser inte programmet längre. Kolla här för mer info.
Citera
2015-01-02, 02:03
  #6
Medlem
your_kings avatar
Citat:
Ursprungligen postat av krysvac
Det fakeinch pratar om är att du ska köra ditt ui (grafiska delen) på en så kallad tråd, och det som tar mycket tid, alltså när du hämtar data, på en annan tråd.

Trådar kan beskrivas som personer, normalt så har du en tråd som gör allt. Tråden visar grafiken och den hämtar informationen, men det gör i sin tur att den bara kan göra en sak i taget, så när den här tråden börjar hämta information så fryser sig programmet för att den slutar rita grafiken då den hämtar informationen eftersom den bara kan göra en sak i taget.

Skulle du däremot ha två trådar, då har du helt plötsligt en tråd som konstant uppdaterar grafiken och en som hämtar information. Och då fryser inte programmet längre. Kolla här för mer info.

Okej jag tackar för svaren, skall kolla upp det.
Citera
2015-01-16, 16:01
  #7
Medlem
Kolla denna youtube tutorial kring threading, han förklarar exakt varför ditt program fryser sig och hur man ska göra för att lösa problemet med hjälp av att skapa trådar för olika "long running tasks":
https://www.youtube.com/watch?v=RhLLxew4-TY

Lycka till!
Citera
2015-01-16, 16:08
  #8
Medlem
Dessutom borde du använda sqlanslutningen med ett using statement, detta för att kasta minnet och stänga anslutningen till databasen efter att du hämtat den data du behöver från databasen:

Kod:
using (SqlConnection connection = new SqlConnection(connectionString)) 
{
      connection.Open();

      //din kod...
}
Citera
2015-05-12, 21:24
  #9
Medlem
Bagant-ss avatar
Använd threads eller backgroundworkers. Ditt program kommer inte att frysa då.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in