Dodatkowy wątek

Witam,

Mam aplikację napisaną w c# do odczytu bazy danych:

private void fleet_Load(object sender, EventArgs e)

{

listView1.View = View.Details;


listView1.Items.Clear();

Thread t = new Thread(new ThreadStart(odbior));

t.Start();

}


private static void odbior()

{

string id;


while (true)

{


try

{

IDbConnection dbcon;

dbcon = new NpgsqlConnection(BazaZmiennych.GetSettings().connectionString);

dbcon.Open();

IDbCommand dbcmd = dbcon.CreateCommand();

string sql = "Select * FROM samochody WHERE id_usera = '" + BazaZmiennych.GetSettings().id + "'";

dbcmd.CommandText = sql;

IDataReader reader = dbcmd.ExecuteReader();


while (reader.Read())

{

ListViewItem lSingleItem;

lSingleItem = listView1.Items.Add(reader["id"].ToString());

lSingleItem.SubItems.Add((string)reader["nazwasamochodu"]);

id = reader["id_cudaka"].ToString();;

////

try

{

IDbConnection dbcon2;

dbcon2 = new NpgsqlConnection(BazaZmiennych.GetSettings().connectionString);

dbcon2.Open();

IDbCommand dbcmd2 = dbcon2.CreateCommand();

string sql2 = "Select * FROM dane WHERE idcudaka = '1' ORDER by id DESC LIMIT 1";

dbcmd2.CommandText = sql;

IDataReader reader2 = dbcmd2.ExecuteReader();

while (reader2.Read())

{

lSingleItem.SubItems.Add(reader["czas"].ToString());

lSingleItem.SubItems.Add(reader["data"].ToString());

}

reader2.Close();

reader2 = null;

dbcmd2.Dispose();

dbcmd2 = null;

dbcon2.Close();

dbcon2 = null;

}

catch (NpgsqlException ex)

{

System.Text.Encoding enc = Encoding.GetEncoding("Windows-1250");

StreamWriter sw = new StreamWriter("c:\\Logs\\log.log", true, enc);

sw.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString() + " :: " + ex);

sw.Flush();

sw.Close();

}

catch (Exception ex)

{

System.Text.Encoding enc = Encoding.GetEncoding("Windows-1250");

StreamWriter sw = new StreamWriter("c:\\Logs\\log.log", true, enc);

sw.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString() + " :: " + ex);

sw.Flush();

sw.Close();

}

}

reader.Close();

reader = null;

dbcmd.Dispose();

dbcmd = null;

dbcon.Close();

dbcon = null;

}


catch (NpgsqlException ex)

{

System.Text.Encoding enc = Encoding.GetEncoding("Windows-1250");

StreamWriter sw = new StreamWriter("c:\\Logs\\log.log", true, enc);

sw.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString() + " :: " + ex);

sw.Flush();

sw.Close();

}

catch (Exception ex)

{

System.Text.Encoding enc = Encoding.GetEncoding("Windows-1250");

StreamWriter sw = new StreamWriter("c:\\Logs\\log.log", true, enc);

sw.WriteLine(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString() + " :: " + ex);

sw.Flush();

sw.Close();

}

Thread.Sleep(5000);

}

}

Zrobiłem wątek “odbior” który powinien uzupełniać mi listvieva danymi, ale niestety nie działa :frowning:

Wywala błąd:nieprawidłowa operacja między wątkami: “do formatu ‘listview’ uzyskiwany jest dostep z watku innego niz watekw ktorym zostal tworzony”

Wiecie może co jest nie tak??

Mógłby ktoś mi pomóc rozwiązać ten błąd??

Northwest

Pod delphi dokładnie tak samo listview nie chce się uzupełniać z innego wątku. samo uzupełnienie daj w metodzie synchronize, lub wyślij komunikat do głównego okna w którym przekaż co do listview trza dodać. Polecam też zrezygnować z listview i zapoznać się z virtualtree, więcej możliwości lepiej wygląda i możesz obsługiwać z kilku wątków jednocześnie.

oki, już sobie poradziłem - dzięki za pomoc :slight_smile:

Skoro poradziłeś to warto napisać o co chodziło i jak naprawiłeś.