2014-01-25 3 views
-1

У меня есть этот код, где я нажимаю управление + м:Как создать экземпляр для нового из рабочего процесса фонового рабочего?

void gkh_KeyDown(object sender, KeyEventArgs e) 
     { 
      if ((e.KeyCode == System.Windows.Forms.Keys.LControlKey) || (e.KeyCode == System.Windows.Forms.Keys.RControlKey)) 
      { 
       controlDown = true; 
      } 

      if (e.KeyCode == System.Windows.Forms.Keys.M && controlDown) 
      { 
       backgroundWorker1.RunWorkerAsync(); 

Тогда BackgroundWorker работают событие:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      if (mf1 == null) 
      { 
       mf1 = new MagnifierForm(mConfiguration, System.Windows.Forms.Cursor.Position); 
       mf1.Show(); 
      } 
     } 

Я использовал контрольную точку и ее получение в конструктор MagnifierForm и делать все, но когда я нажимаю кнопку «Продолжить», я никогда не вижу эту форму MagnifierForm. Зачем ?

EDIT **

Причина я хотел использовать BackgroundWorker, чтобы показать новую форму, что в основной форме, где я показать новую форму У меня есть событие тиков таймера и по какой-то причине этот таймер, когда его ход только когда его запуск заставляет новую форму отображаться в другом месте от курсора мыши, и форма перемещается/сдвигается туда, где находится курсор мыши. Когда таймер не работает, проблем нет. Я показываю новую форму и показываю ее точно там, где находится указатель мыши.

Я не знаю, почему это событие таймера создает проблему, и таймер не связан ни с чем новой формой, которую я хочу показать.

Это событие таймера я имею в основной форме:

private void timer2_Tick(object sender, EventArgs e) 
     { 
      label1.Visible = true; 
      if (counter == 200) 
      { 
       timer2.Enabled = false;//counter = 0; 
       return; 
      } 
      counter += 1; 
      distance = (float)counter; 
      CloudEnteringAlert.cloudalert(bitmapwithclouds, distance); 
      pictureBox1.Invalidate(); 

Теперь я обнаружил, что если я удалить для теста линии:

CloudEnteringAlert.cloudalert(bitmapwithclouds, distance); 

И таймер работает там без проблем. Новая форма показывает точно, где находится курсор мыши. Это метод cloudalert, что делает эту проблему и я не знаю, почему:

public static List<PointF> cloudalert(Bitmap bmp, float kilometers) 
     { 
      AddDistanceToPoints = new List<PointF>(); 
      Color c1 = Color.White; 
      Color c2 = Color.FromArgb(c1.A, 
       (int)(c1.R * 1), (int)(c1.G * 1), (int)(c1.B * 1)); 
      Load(); 
      float distance = kilometers/(float)1.09; 
      clouds = new List<PointF>(); 
      clouds1 = new List<PointF>(); 
      file = Path.GetDirectoryName(Application.LocalUserAppDataPath) + "\\Data" + "\\Data.txt"; 
      OptionsFile setting_file = new OptionsFile(file); 
      LoadPoints_X = setting_file.GetListFloatKey("Points Coordinates X"); 
      LoadPoints_Y = setting_file.GetListFloatKey("Points Coordinates Y"); 
      for (int i = 0; i < PointsFloat.Count; i++) 
      { 
       //clouds1.Add(new PointF(LoadPoints_X[i] - distance, LoadPoints_Y[i])); 
       AddDistanceToPoints.Add(new PointF(PointsFloat[i].X - distance, PointsFloat[i].Y)); 
      } 
      bmp = FastComparison(bmp, Properties.Resources.clean_radar_image); 
      newbitmap = bmp; 
      for (int x = 0; x < AddDistanceToPoints.Count; x++)//clouds1.Count; x++) 
      { 
       if (AddDistanceToPoints[x].X > 0)//clouds1[x].X > 0) 
       { 
        //Color color = bmp.GetPixel((int)clouds1[x].X, (int)clouds1[x].Y); 
        Color color = bmp.GetPixel((int)AddDistanceToPoints[x].X, (int)AddDistanceToPoints[x].Y); 
        int dR = (int)color.R; 
        int dG = (int)color.G; 
        int dB = (int)color.B; 
        if (dR == 0 && dG == 0 && dB == 0) 
        { 

        } 
        else 
        { 
         //clouds.Add(new PointF(clouds1[x].X, clouds1[x].Y)); 
         clouds.Add(new PointF(AddDistanceToPoints[x].X, AddDistanceToPoints[x].Y)); 
         //newbitmap.SetPixel((int)clouds1[x].X, (int)clouds1[x].Y, Color.White); 
         newbitmap.SetPixel((int)AddDistanceToPoints[x].X, (int)AddDistanceToPoints[x].Y, Color.White); 

        } 
       } 

      } 
      //newbitmap.Save(@"d:\test\newbitmap.jpg"); 
      if (clouds.Count == 0) 
      { 
       cloudsfound = false; 
       cloudsdistance.Text = distance.ToString(); 
       //clouds = null; 
       return clouds 
; 
      } 
      else 
      { 
       cloudsfound = true; 

       for (int i = 0; i < clouds.Count; i++) 
       { 
        pointtocolor.Add(clouds[i]); 
        cloudsdistance.Text = distance.ToString(); 
       } 
      } 
      return clouds; 
     } 

И в основной форме им показывает новую форму по нажатию кнопки, например:

private void button1_Click(object sender, EventArgs e) 
     { 
      if (mf1 == null) 
      { 
       mf1 = new MagnifierForm(mConfiguration, System.Windows.Forms.Cursor.Position); 
       mf1.Show(); 
      } 
     } 

Тогда почему этот таймер tick или более, почему этот метод cloudalert делает отображение mf1 в другом месте на секунду, а затем на слайде формы или перемещении туда, где находится указатель мыши. Но когда этот метод я удаляю или останавливаю таймер и показываю новую форму, поэтому нет никаких проблем, когда форма отображается прямо там, где находится курсор мыши.

И новая форма, я показываю ее в любом месте на экране, я не показываю ее только по основной форме, я показываю ее где-нибудь курсор mosue. Мышь может быть на панели задач или на 0,0 экрана или в любом месте, а затем я нажимаю кнопку1 или у меня есть глобальные ключи, поэтому я делаю Ctrl + M

И когда таймер работает с этим методом cloudalert, форма отображается в другом месте, а затем перемещает слайд туда, где находится курсор мыши.

Вы можете получить новые форму им пытается показать, что это увеличительное стекло здесь:

http://www.codeproject.com/Articles/18235/Simple-Magnifier

Что им пытаются сделать это не с помощью этого меню лупы он есть, но с помощью моего события нажатия кнопки или клавиши ctrl + m, чтобы отобразить форму лупы. Но у меня есть эта проблема.

Если im использует это меню лупы и таймер работает с методом, проблем нет.

Странное отклонение, где проблема с моим таймером2/метод cloudalert.

+2

Что еще вы делаете в мероприятии DoWork? Если вы просто создаете новую форму, не беспокойтесь использовать «BackgroundWorker». Просто сделайте это на основном потоке пользовательского интерфейса. [Похожие сообщения.] (Http://stackoverflow.com/questions/2073076/c-sharp-winforms-possible-to-construct-form-on-background-thread-then-display) –

+0

Вызов Show() из bgw нить должна бросать исключение ... В режиме отладки, по крайней мере. –

+0

Причина, по которой я хотел использовать фонового работника и показать форму, что если я покажу форму в коде формы ui, у меня есть таймер там, где мне нужно запустить его, и этот таймер сделает новую форму для показа на определенном точку/местоположение на экране, а затем переместите/сдвиньте туда, где находится курсор мыши. Я не понимаю, почему. Я не знаю, почему таймер заставляет это случиться. Но теперь, когда я использовал фонового рабочего, даже если таймер работает, новая форма показывает, где находится курсор мыши. Но вы сказали мне не использовать этот ui в фоновом режиме. Так как же я могу сделать что-то подобное? – user3200169

ответ

1

DoWork запущен в рабочей нити. Вы не должны пытаться изменить свой интерфейс оттуда, но только из основного потока пользовательского интерфейса.

3

Во-первых - не работайте с пользовательским интерфейсом из нескольких потоков. Если вы хотите отобразить что-то, когда работник завершает выполнение, то обрабатывать RunWorkerCompleted событие (этот обработчик работает на основном потоке):

void backgroundWorker1_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (mf1 == null) 
    { 
     mf1 = new MagnifierForm(mConfiguration, Cursor.Position); 
     mf1.Show(); 
    } 
} 

Во-вторых - ваш код не работает, потому что фоновый поток завершает работу. Если вы измените mf1.Show() на mf1.ShowDialog(), вы увидите свою форму.

+0

Sergey this mf1.ShowDialog() решил мою проблему с таймером. Я описал выше проблему с таймером, который у меня есть в форме, где я показываю новую форму. Но так как использование ui в фоном работает плохо, что еще я могу сделать? – user3200169

+0

@ user3200169 Обработчик событий Timer.Tick будет выполнен в основном потоке - проблем с отображением формы не должно быть. Может быть, вы увольняете много раз подряд? –

Смежные вопросы