Can`t open a form in another thread.

Ask questions about creating Graphical User Interfaces (GUI) in PowerShell and using WinForms controls.
Forum rules
Do not post any licensing information in this forum.

Any code longer than three lines should be added as code using the 'Select Code' dropdown menu or attached as a file.
Locked
TolikTipaTut1
Posts: 8
Meble kuchenne na zamówienie - na wymiar - Wrocław
Joined: Mon Oct 07, 2019 10:44 am

Can`t open a form in another thread.

Post by TolikTipaTut1 »

Hello!
I`m creating a Form in another thread using powershell.
I created my own class
  1. class MainForm : System.Windows.Forms.Form {
  2.  
  3. <#some code#>
  4.  
  5. }
Form name is "Start_Window". I`m using "ShowDialog()" method to show it.
If i run my script in ISE, "Start_Window" appears.
But if i run my script using Powershell Studio 2019, nothing happens ...
This is my code:
  1.  $Start_Window_syncHash = [hashtable]::Synchronized(@{})
  2.  
  3.    $Start_Window_Runspace = [runspacefactory]::CreateRunspace()
  4.  
  5.     $Start_Window_Runspace.ApartmentState = "STA"
  6.  
  7.     $Start_Window_Runspace.ThreadOptions = "ReuseThread"
  8.  
  9.     $Start_Window_Runspace.Open()
  10.  
  11.     $Start_Window_Runspace.SessionStateProxy.SetVariable("Start_Window_syncHash",$Start_Window_syncHash)
  12.  
  13.     $Start_Window_Cmd = [PowerShell]::Create().AddScript({
  14.  
  15.     class MainForm : System.Windows.Forms.Form {
  16.  
  17.     <#some code#>
  18.  
  19.      }
  20.  
  21.       <#some code#> ....
  22.  
  23.       $Start_Window_syncHash.Start_Window = [MainForm]::new()
  24.  
  25.       $Start_Window_syncHash.Start_Window.ShowDialog() | Out-Null
  26.  
  27.       $Start_Window_syncHash.Error = $Error
  28.  
  29.     })
  30.  
  31.     $Start_Window_Cmd.Runspace = $Start_Window_Runspace
  32.  
  33.     $Start_Window_data = $Start_Window_Cmd.BeginInvoke()

jvierra
Posts: 14335
Joined: Tue May 22, 2007 9:57 am
Contact:

Re: Can`t open a form in another thread.

Post by jvierra »

Your code shows a windows for me. Just copy and paste into a console but first add this line:
Add-Type -AssemblyName System.windows.Forms

The following will give you some idea of how this is done and how to get information back after the form has closed. Try not to use the synchash when not needed.

Code: Select all

$scriptCode = {

	class MainForm : System.Windows.Forms.Form {
		MainForm(){
			$this.StartPosition = 'CenterScreen'
			$b = [System.Windows.Forms.Button]@{Name='buttonTest';Text='Test Form'}
			$this.Controls.Add($b)
			$this.Controls['buttonTest'].add_Click({Write-Host 'hello'})
		}
	}
			
	<#some code#>
	$form = [MainForm]::new()
	$syncHash.Form = $form 
	$form.ShowDialog() | Out-Null
}

Add-Type -AssemblyName System.Windows.Forms

$syncHash = [hashtable]::Synchronized(@{})
$runspace = [runspacefactory]::CreateRunspace()
$runspace.ApartmentState = 'STA'
$runspace.ThreadOptions = 'ReuseThread'
$runspace.Open()
$runspace.SessionStateProxy.SetVariable('syncHash',$syncHash)
$ps = [PowerShell]::Create().AddScript($scriptCode)
$ps.Runspace = $runspace
$asyncResult = $ps.Invoke()
$ps.Streams.Information
$ps.Streams.Error

jvierra
Posts: 14335
Joined: Tue May 22, 2007 9:57 am
Contact:

Re: Can`t open a form in another thread.

Post by jvierra »

This is how to use InvokeAsync to collect data returned.

Code: Select all

$scriptCode = {

	class MainForm : System.Windows.Forms.Form {
		MainForm(){
			$this.StartPosition = 'CenterScreen'
			$this.add_Load({
            })
			$b = [System.Windows.Forms.Button]@{Name='buttonTest';Text='Test Form'}
			$this.Controls.Add($b)
			$this.Controls['buttonTest'].add_Click({Write-Host 'hello'})
		}
		
	}
			
	<#some code#>
	$form = [MainForm]::new()
	$syncHash.Form = $form 
	$form.ShowDialog() | Out-Null
	# this will bcome output
	'This is an output message'
}

Add-Type -AssemblyName System.Windows.Forms

$syncHash = [hashtable]::Synchronized(@{})
$runspace = [runspacefactory]::CreateRunspace()
$runspace.ApartmentState = 'STA'
$runspace.ThreadOptions = 'ReuseThread'
$runspace.Open()
$runspace.SessionStateProxy.SetVariable('syncHash',$syncHash)
$ps = [PowerShell]::Create().AddScript($scriptCode)
$ps.Runspace = $runspace
$asyncResult = $ps.BeginInvoke()
pause  # let this pause until you close the form
$ps.EndInvoke($asyncResult)  # regular output is collected here

# alternate streams are here
$ps.Streams.Information
$ps.Streams.Error
$ps.Streams.Verbose
# ... etc

TolikTipaTut1
Posts: 8
Joined: Mon Oct 07, 2019 10:44 am

Re: Can`t open a form in another thread.

Post by TolikTipaTut1 »

jvierra, thank you for your answer!

But I still don`t understand...
In your code you used "$ps.Invoke()" method to open the window. This method opens a window. But while the window is open, the code should execute further in another thread... And if I use "Invoke()" method instead "BeginInvoke()", I should close the window to continue executing the code...

My code is below
  1. Add-Type -AssemblyName System.Windows.Form
  2.  
  3. function Main
  4.  
  5. {
  6.  
  7.     try
  8.  
  9.     {
  10.  
  11.         [xml]$Script_Conf = Get-Content .\Main_Conf.xml -ErrorAction Stop
  12.  
  13.         Write-Host "Конфигурационный файл приложения существует! Запускаю выполнение!" -ForegroundColor Green
  14.  
  15.         $Plane_Pattern_Path = $Script_Conf.config.Plane_Pattern_Path
  16.  
  17.     }
  18.  
  19.     Catch [System.Management.Automation.ItemNotFoundException] {
  20.  
  21.         Write-Host "В папке со скриптом не найден конфигурационный приложения!" -ForegroundColor Red
  22.  
  23.         Write-Host "Переместите конфигурационный файл в папку, где будет запусакться скрипт!" -ForegroundColor Red
  24.  
  25.         Write-Host "Прекращаю работу..." -ForegroundColor Red
  26.  
  27.         return;
  28.  
  29.     }
  30.  
  31.    
  32.  
  33.     $Start_Window_syncHash = [hashtable]::Synchronized(@{ })
  34.  
  35.     $Start_Window_Runspace = [runspacefactory]::CreateRunspace()
  36.  
  37.     $Start_Window_Runspace.ApartmentState = "STA"
  38.  
  39.     $Start_Window_Runspace.ThreadOptions = "ReuseThread"
  40.  
  41.     $Start_Window_Runspace.Open()
  42.  
  43.     $Start_Window_Runspace.SessionStateProxy.SetVariable("Start_Window_syncHash", $Start_Window_syncHash)
  44.  
  45.     $Start_Window_Cmd = [PowerShell]::Create().AddScript({
  46.  
  47.             Add-Type -AssemblyName System.Windows.Forms
  48.  
  49.             Add-Type -AssemblyName System.Drawing
  50.  
  51.             param ([xml]$_config,
  52.  
  53.                 [string]$_plane_pattern_path)
  54.  
  55.             Class StartModeling: System.Windows.Forms.Button
  56.  
  57.             {
  58.  
  59.                 [System.Windows.Forms.Button]$Butt
  60.  
  61.                
  62.  
  63.                 [void] Init ()
  64.  
  65.                 {
  66.  
  67.                     $this.Location = [System.Drawing.Point]::new(100, 70)
  68.  
  69.                     $this.Size = [System.Drawing.Size]::new(200, 60)
  70.  
  71.                     $this.Font = [System.Drawing.Font]::new('Times New Roman', 14, [System.Drawing.FontStyle]::Bold)
  72.  
  73.                     $this.Text = 'Начать моделирование'
  74.  
  75.                 }
  76.  
  77.                
  78.  
  79.                 StartModeling ()
  80.  
  81.                 {
  82.  
  83.                     $this.Init()
  84.  
  85.                 }
  86.  
  87.                
  88.  
  89.                 [void] Check_Config ()
  90.  
  91.                 {
  92.  
  93.                    
  94.  
  95.                 }
  96.  
  97.             }
  98.  
  99.            
  100.  
  101.             Class ShowMe: System.Windows.Forms.Button
  102.  
  103.             {
  104.  
  105.                 [System.Windows.Forms.Button]$Butt
  106.  
  107.                
  108.  
  109.                 [void] Init ()
  110.  
  111.                 {
  112.  
  113.                     $this.Size = [System.Drawing.Size]::new(200, 60)
  114.  
  115.                     $this.Location = [System.Drawing.Point]::new(100, 250)
  116.  
  117.                     $this.Text = 'Автор'
  118.  
  119.                     $this.Font = [System.Drawing.Font]::new('Times New Roman', 14, [System.Drawing.FontStyle]::Bold)
  120.  
  121.                     $this.Add_Click({
  122.  
  123.                             $this.ShowAuthor()
  124.  
  125.                         })
  126.  
  127.                 }
  128.  
  129.                
  130.  
  131.                 ShowMe ()
  132.  
  133.                 {
  134.  
  135.                     $this.Init()
  136.  
  137.                 }
  138.  
  139.                
  140.  
  141.                 [Void] ShowAuthor ()
  142.  
  143.                 {
  144.  
  145.                     [System.Windows.Forms.MessageBox]::SHow("Автор: Я.Я. Месенгисер", "Автор")
  146.  
  147.                 }
  148.  
  149.             }
  150.  
  151.            
  152.  
  153.             Class ShowPatterns: System.Windows.Forms.Button
  154.  
  155.             {
  156.  
  157.                 [System.Windows.Forms.Button]$Butt
  158.  
  159.                
  160.  
  161.                 [void] Init ()
  162.  
  163.                 {
  164.  
  165.                     $this.Size = [System.Drawing.Size]::new(200, 60)
  166.  
  167.                     $this.Location = [System.Drawing.Point]::new(100, 160)
  168.  
  169.                     $this.Font = [System.Drawing.Font]::new('Times New Roman', 14, [System.Drawing.FontStyle]::Bold)
  170.  
  171.                     $this.Text = 'Настроить шаблоны'
  172.  
  173.                 }
  174.  
  175.                
  176.  
  177.                 ShowPatterns ()
  178.  
  179.                 {
  180.  
  181.                     $this.Init()
  182.  
  183.                 }
  184.  
  185.             }
  186.  
  187.            
  188.  
  189.             Class MainForm: System.Windows.Forms.Form
  190.  
  191.             {
  192.  
  193.                 [StartModeling]$StartModeling
  194.  
  195.                 [ShowMe]$ShowAuthor
  196.  
  197.                 [ShowPatterns]$ShowPatterns
  198.  
  199.                 [System.Windows.Forms.Form]$PatConf
  200.  
  201.                
  202.  
  203.                 [void] Init ()
  204.  
  205.                 {
  206.  
  207.                     $this.Size = [System.Drawing.Size]::new(400, 500)
  208.  
  209.                    
  210.  
  211.                     $this.StartModeling = [StartModeling]::new()
  212.  
  213.                     $this.ShowAuthor = [ShowMe]::new()
  214.  
  215.                     $this.ShowPatterns = [ShowPatterns]::new()
  216.  
  217.                    
  218.  
  219.                     $this.ShowPatterns.Add_Click({
  220.  
  221.                             $this.Parent.PatConf.ShowDialog()
  222.  
  223.                         })
  224.  
  225.                    
  226.  
  227.                     $this.Controls.Add($this.StartModeling)
  228.  
  229.                     $this.Controls.Add($this.ShowAuthor)
  230.  
  231.                     $this.Controls.Add($this.ShowPatterns)
  232.  
  233.                 }
  234.  
  235.                
  236.  
  237.                 MainForm ([System.Windows.Forms.Form]$_patConf)
  238.  
  239.                 {
  240.  
  241.                     $this.Init()
  242.  
  243.                     $this.PatConf = $_patConf
  244.  
  245.                 }
  246.  
  247.             }
  248.  
  249.            
  250.  
  251.             Class CreatePattern: System.Windows.Forms.Button
  252.  
  253.             {
  254.  
  255.                 [void] Init ()
  256.  
  257.                 {
  258.  
  259.                     $this.Location = [System.Drawing.Point]::new(50, 300)
  260.  
  261.                     $this.Size = [System.Drawing.Size]::new(250, 30)
  262.  
  263.                     $this.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
  264.  
  265.                     $this.Text = "Создать шаблон"
  266.  
  267.                 }
  268.  
  269.                
  270.  
  271.                 CreatePattern ()
  272.  
  273.                 {
  274.  
  275.                     $this.Init()
  276.  
  277.                 }
  278.  
  279.             }
  280.  
  281.            
  282.  
  283.             Class UpdatePattern: System.Windows.Forms.Button
  284.  
  285.             {
  286.  
  287.                
  288.  
  289.                 [bool]$IsShown
  290.  
  291.                
  292.  
  293.                 [void] Init ()
  294.  
  295.                 {
  296.  
  297.                     $this.Location = [System.Drawing.Point]::new(370, 300)
  298.  
  299.                     $this.Size = [System.Drawing.Size]::new(250, 30)
  300.  
  301.                     $this.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
  302.  
  303.                     $this.Text = "Просмотр шаблона"
  304.  
  305.                 }
  306.  
  307.                
  308.  
  309.                 UpdatePattern ()
  310.  
  311.                 {
  312.  
  313.                     $this.Init()
  314.  
  315.                 }
  316.  
  317.                
  318.  
  319.                 ViewPatternConf ([xml]$PatternConf, [System.Windows.Forms.DataGridView]$GetPatterns, [System.Windows.Forms.DataGridView]$UpdatePatterns)
  320.  
  321.                 {
  322.  
  323.                     $this.ClearPatternWindow($UpdatePatterns)
  324.  
  325.                     $Selected = $GetPatterns.SelectedCells.Count
  326.  
  327.                     if ($Selected -eq 1)
  328.  
  329.                     {
  330.  
  331.                         $this.Parent.UpdatePatterns.Visible = $true
  332.  
  333.                         $this.Parent.SavePattern.Visible = $true
  334.  
  335.                         $this.Parent.DeletePattern.Visible = $true
  336.  
  337.                         $PatternNum = $GetPatterns.CurrentCell.RowIndex
  338.  
  339.                         $this.UpdateRows([xml]$PatternConf, [System.Windows.Forms.DataGridView]$UpdatePatterns, $PatternNum)
  340.  
  341.                     }
  342.  
  343.                     if ($Selected -gt 1)
  344.  
  345.                     {
  346.  
  347.                         [System.Windows.Forms.MessageBox]::Show("Вы не можете выбрать более одного шаблона для редактирования!")
  348.  
  349.                     }
  350.  
  351.                 }
  352.  
  353.                
  354.  
  355.                 ClearPatternWindow ([System.Windows.Forms.DataGridView]$UpdatePatterns)
  356.  
  357.                 {
  358.  
  359.                     $Rows = $UpdatePatterns.Rows.Count
  360.  
  361.                     if ($Rows -gt 0)
  362.  
  363.                     {
  364.  
  365.                         for ($i = 0; $i -le $Rows - 1; $i++)
  366.  
  367.                         {
  368.  
  369.                             $UpdatePatterns.Rows.RemoveAt(0)
  370.  
  371.                         }
  372.  
  373.                     }
  374.  
  375.                 }
  376.  
  377.                
  378.  
  379.                 UpdateRows ([xml]$PatternConf, [System.Windows.Forms.DataGridView]$UpdatePatterns, [int]$PatternNum)
  380.  
  381.                 {
  382.  
  383.                     if ($PatternConf.Patterns.ChildNodes.Count -eq 1)
  384.  
  385.                     {
  386.  
  387.                         $UpdatePatterns.Rows.Add('Имя шаблона', $PatternConf.Patterns.Pattern.PatternName)
  388.  
  389.                         $UpdatePatterns.Rows.Add('Модель', $PatternConf.Patterns.Pattern.Model)
  390.  
  391.                         $UpdatePatterns.Rows.Add('Минимальная скорость полета', $PatternConf.Patterns.Pattern.MinSpeed)
  392.  
  393.                         $UpdatePatterns.Rows.Add('Максимальная скорость полета', $PatternConf.Patterns.Pattern.MaxSpeed)
  394.  
  395.                         $UpdatePatterns.Rows.Add('Максимальный прирост скорости (1 сек)', $PatternConf.Patterns.Pattern.SpeedAdjust)
  396.  
  397.                         $UpdatePatterns.Rows.Add('Максимальный сброс скорости (1 сек)', $PatternConf.Patterns.Pattern.SpeedDecrease)
  398.  
  399.                         $UpdatePatterns.Rows.Add('Максимальный угол поворота (1 сек)', $PatternConf.Patterns.Pattern.MaxRotAng)
  400.  
  401.                     }
  402.  
  403.                     if ($PatternConf.Patterns.ChildNodes.Count -gt 1)
  404.  
  405.                     {
  406.  
  407.                         $UpdatePatterns.Rows.Add('Имя шаблона', $PatternConf.Patterns.Pattern[$PatternNum].PatternName)
  408.  
  409.                         $UpdatePatterns.Rows.Add('Модель', $PatternConf.Patterns.Pattern[$PatternNum].Model)
  410.  
  411.                         $UpdatePatterns.Rows.Add('Минимальная скорость полета', $PatternConf.Patterns.Pattern[$PatternNum].MinSpeed)
  412.  
  413.                         $UpdatePatterns.Rows.Add('Максимальная скорость полета', $PatternConf.Patterns.Pattern[$PatternNum].MaxSpeed)
  414.  
  415.                         $UpdatePatterns.Rows.Add('Максимальный прирост скорости (1 сек)', $PatternConf.Patterns.Pattern[$PatternNum].SpeedAdjust)
  416.  
  417.                         $UpdatePatterns.Rows.Add('Максимальный сброс скорости (1 сек)', $PatternConf.Patterns.Pattern[$PatternNum].SpeedDecrease)
  418.  
  419.                         $UpdatePatterns.Rows.Add('Максимальный угол поворота (1 сек)', $PatternConf.Patterns.Pattern[$PatternNum].MaxRotAng)
  420.  
  421.                     }
  422.  
  423.                 }
  424.  
  425.             }
  426.  
  427.            
  428.  
  429.             Class SavePattern: System.Windows.Forms.Button
  430.  
  431.             {
  432.  
  433.                 [void] Init()
  434.  
  435.                 {
  436.  
  437.                     $this.Location = [System.Drawing.Point]::new(50, 620)
  438.  
  439.                     $this.Size = [System.Drawing.Size]::new(250, 30)
  440.  
  441.                     $this.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
  442.  
  443.                     $this.Text = "Сохранить шаблон"
  444.  
  445.                     $this.Visible = $false
  446.  
  447.                 }
  448.  
  449.                
  450.  
  451.                 SavePattern ()
  452.  
  453.                 {
  454.  
  455.                     $this.Init()
  456.  
  457.                 }
  458.  
  459.                
  460.  
  461.                 Request_Answer()
  462.  
  463.                 {
  464.  
  465.                     [System.Windows.Forms.DialogResult]$User_Answer = [System.Windows.Forms.MessageBox]::Show("Вы уверены ?", "Запрос подтверждения", [System.Windows.Forms.MessageBoxButtons]::YesNoCancel)
  466.  
  467.                 }
  468.  
  469.                
  470.  
  471.             }
  472.  
  473.            
  474.  
  475.             Class DeletePattern: System.Windows.Forms.Button
  476.  
  477.             {
  478.  
  479.                 [void] Init ()
  480.  
  481.                 {
  482.  
  483.                     $this.Location = [System.Drawing.Point]::new(370, 620)
  484.  
  485.                     $this.Size = [System.Drawing.Size]::new(250, 30)
  486.  
  487.                     $this.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
  488.  
  489.                     $this.Text = "Удалить шаблон"
  490.  
  491.                     $this.Visible = $false
  492.  
  493.                 }
  494.  
  495.                
  496.  
  497.                 DeletePattern ()
  498.  
  499.                 {
  500.  
  501.                     $this.Init()
  502.  
  503.                 }
  504.  
  505.             }
  506.  
  507.            
  508.  
  509.             Class GetPatterns: System.Windows.Forms.DataGridView
  510.  
  511.             {
  512.  
  513.                 [void] Init()
  514.  
  515.                 {
  516.  
  517.                     $this.Location = [System.Drawing.Point]::new(50, 50)
  518.  
  519.                     $this.Size = [System.Drawing.Size]::new(570, 230)
  520.  
  521.                     $this.AllowUserToAddRows = $false
  522.  
  523.                     $this.AllowUserToDeleteRows = $false
  524.  
  525.                 }
  526.  
  527.                
  528.  
  529.                 GetPatterns ()
  530.  
  531.                 {
  532.  
  533.                     $this.Init()
  534.  
  535.                 }
  536.  
  537.             }
  538.  
  539.            
  540.  
  541.             Class UpdatePatterns: System.Windows.Forms.DataGridView
  542.  
  543.             {
  544.  
  545.                 [void] Init()
  546.  
  547.                 {
  548.  
  549.                     $this.Location = [System.Drawing.Point]::new(50, 360)
  550.  
  551.                     $this.Size = [System.Drawing.Size]::new(570, 230)
  552.  
  553.                     $this.AllowUserToAddRows = $false
  554.  
  555.                     $this.AllowUserToDeleteRows = $false
  556.  
  557.                     $this.Visible = $false
  558.  
  559.                 }
  560.  
  561.                
  562.  
  563.                 UpdatePatterns ()
  564.  
  565.                 {
  566.  
  567.                     $this.Init()
  568.  
  569.                 }
  570.  
  571.             }
  572.  
  573.            
  574.  
  575.             Class PatternProperties: System.Windows.Forms.DataGridViewColumn
  576.  
  577.             {
  578.  
  579.                 [void] Init ()
  580.  
  581.                 {
  582.  
  583.                     $this.Frozen = $true
  584.  
  585.                     $this.DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter
  586.  
  587.                     $this.CellTemplate = [System.Windows.Forms.DataGridViewTextBoxCell]::new()
  588.  
  589.                     $this.HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter
  590.  
  591.                 }
  592.  
  593.                
  594.  
  595.                 PatternProperties ()
  596.  
  597.                 {
  598.  
  599.                     $this.Init()
  600.  
  601.                 }
  602.  
  603.             }
  604.  
  605.            
  606.  
  607.             Class Main_Window: System.Windows.Forms.Form
  608.  
  609.             {
  610.  
  611.                 [CreatePattern]$CreatPattern
  612.  
  613.                 [UpdatePattern]$UpdatePattern
  614.  
  615.                 [SavePattern]$SavePattern
  616.  
  617.                 [DeletePattern]$DeletePattern
  618.  
  619.                 [GetPatterns]$GetPatterns
  620.  
  621.                 [UpdatePatterns]$UpdatePatterns
  622.  
  623.                 [PatternProperties]$PatternProperty
  624.  
  625.                 [PatternProperties]$PatternName
  626.  
  627.                 [PatternProperties]$PatternHost
  628.  
  629.                 [xml]$PatternConf
  630.  
  631.                
  632.  
  633.                 [void] Init ()
  634.  
  635.                 {
  636.  
  637.                     $a = $this.PatternConf.Patterns.Pattern.Count
  638.  
  639.                     $this.Size = [System.Drawing.Size]::new(700, 800)
  640.  
  641.                     $this.BackColor = [System.Drawing.Color]::AliceBlue
  642.  
  643.                     $this.Add_load({
  644.  
  645.                             try
  646.  
  647.                             {
  648.  
  649.                                 $_path = $_plane_pattern_path
  650.  
  651.                                 $this.PatternConf = Get-Content $_path -ErrorAction Stop
  652.  
  653.                             }
  654.  
  655.                             catch [System.Management.Automation.ItemNotFoundException] {
  656.  
  657.                                 [System.Windows.Forms.MessageBox]::Show("Файл шаблонов отсутствует! Переместите файл с шаблонами в папку, где находится скрипт, и перезапустите скрипт, или создайте шаблоны в интерфейсе!", "Внимание!")
  658.  
  659.                             }
  660.  
  661.                             if ($this.PatternConf.Patterns.ChildNodes.Count -eq 1)
  662.  
  663.                             {
  664.  
  665.                                 $this.GetPatterns.Rows.Add($this.PatternConf.Patterns.Pattern.PatternName)
  666.  
  667.                             }
  668.  
  669.                             if ($this.PatternConf.Patterns.ChildNodes.Count -gt 1)
  670.  
  671.                             {
  672.  
  673.                                 for ($i = 0; $i -lt $this.PatternConf.Patterns.Pattern.Count; $i++)
  674.  
  675.                                 {
  676.  
  677.                                     $this.GetPatterns.Rows.Add($this.PatternConf.Patterns.Pattern[$i].PatternName)
  678.  
  679.                                 }
  680.  
  681.                             }
  682.  
  683.                         })
  684.  
  685.                    
  686.  
  687.                     $this.CreatPattern = [CreatePattern]::new()
  688.  
  689.                     $this.Controls.Add($this.CreatPattern)
  690.  
  691.                    
  692.  
  693.                     $this.UpdatePattern = [UpdatePattern]::new()
  694.  
  695.                     $this.Controls.Add($this.UpdatePattern)
  696.  
  697.                     $this.UpdatePattern.Add_Click({
  698.  
  699.                             $this.ViewPatternConf($this.Parent.PatternConf, $this.Parent.GetPatterns, $this.Parent.UpdatePatterns)
  700.  
  701.                         })
  702.  
  703.                    
  704.  
  705.                     $this.SavePattern = [SavePattern]::new()
  706.  
  707.                     $this.Controls.Add($this.SavePattern)
  708.  
  709.                     $this.SavePattern.Add_Click({
  710.  
  711.                             $this.Request_Answer()
  712.  
  713.                             $this.Parent.UpdatePatterns.Visible = $false
  714.  
  715.                             $this.Visible = $false
  716.  
  717.                             $this.Parent.DeletePattern.Visible = $false
  718.  
  719.                         })
  720.  
  721.                    
  722.  
  723.                     $this.DeletePattern = [DeletePattern]::new()
  724.  
  725.                     $this.Controls.Add($this.DeletePattern)
  726.  
  727.                    
  728.  
  729.                     $this.GetPatterns = [GetPatterns]::new()
  730.  
  731.                     $this.Controls.Add($this.GetPatterns)
  732.  
  733.                    
  734.  
  735.                     $this.UpdatePatterns = [UpdatePatterns]::new()
  736.  
  737.                     $this.Controls.Add($this.UpdatePatterns)
  738.  
  739.                    
  740.  
  741.                     $this.PatternProperty = [PatternProperties]::new()
  742.  
  743.                     $this.PatternProperty.Width = 528
  744.  
  745.                     $this.PatternProperty.HeaderText = 'Название шаблона'
  746.  
  747.                     $this.PatternProperty.DataPropertyName = 'Pattern Property'
  748.  
  749.                     $this.PatternProperty.ReadOnly = $true
  750.  
  751.                     $this.PatternProperty.Name = 'PatternProperty'
  752.  
  753.                     $this.GetPatterns.Columns.Add($this.PatternProperty)
  754.  
  755.                    
  756.  
  757.                     $this.PatternName = [PatternProperties]::new()
  758.  
  759.                     $this.PatternName.Width = 352
  760.  
  761.                     $this.PatternName.HeaderText = 'Параметр'
  762.  
  763.                     $this.PatternName.DataPropertyName = 'Pattern Name'
  764.  
  765.                     $this.PatternName.ReadOnly = $true
  766.  
  767.                     $this.PatternName.Name = 'Param'
  768.  
  769.                     $this.UpdatePatterns.Columns.Add($this.PatternName)
  770.  
  771.                    
  772.  
  773.                     $this.PatternHost = [PatternProperties]::new()
  774.  
  775.                     $this.PatternHost.Width = 176
  776.  
  777.                     $this.PatternHost.HeaderText = 'Значение'
  778.  
  779.                     $this.PatternHost.DataPropertyName = 'Pattern Host'
  780.  
  781.                     $this.PatternHost.ReadOnly = $false
  782.  
  783.                     $this.PatternHost.Name = 'Host'
  784.  
  785.                     $this.UpdatePatterns.Columns.Add($this.PatternHost)
  786.  
  787.                    
  788.  
  789.                 }
  790.  
  791.                
  792.  
  793.                 Main_Window ()
  794.  
  795.                 {
  796.  
  797.                     $this.Init()
  798.  
  799.                 }
  800.  
  801.             } #::Main_Window
  802.  
  803.            
  804.  
  805.             $Start_Window_syncHash.PatternConfigWindow = [Main_Window]::new()
  806.  
  807.             $Start_Window_syncHash.Start_Window = [MainForm]::new($Start_Window_syncHash.PatternConfigWindow)
  808.  
  809.             $Start_Window_syncHash.Start_Window.ShowDialog() | Out-Null
  810.  
  811.             $Start_Window_syncHash.Error = $Error
  812.  
  813.         })
  814.  
  815.     $Start_Window_Cmd.AddArgument($Script_Conf) | Out-Null
  816.  
  817.     $Start_Window_Cmd.AddArgument($Plane_Pattern_Path) | Out-Null
  818.  
  819.     $Start_Window_Cmd.Runspace = $Start_Window_Runspace
  820.  
  821.     $Start_Window_data = $Start_Window_Cmd.BeginInvoke()
  822.  
  823.     Start-Sleep 4
  824.  
  825.     $Start_Window_data
  826.  
  827. }
  828.  
  829. Main

jvierra
Posts: 14335
Joined: Tue May 22, 2007 9:57 am
Contact:

Re: Can`t open a form in another thread.

Post by jvierra »

I posted two examples that you can run at a prompt. The second one uses BeginInvoke. Run them at a prompt and try to understand what I am showing you. Posting a very long sript does not help to solve the issue. Understanding how to use runspaces is the first thing to do.

When posting long scripts please attach them as a file usable in PowerShell Studio (PSF) to illustrate your issue.

Run and try to understand m code and you will begin to see how this needs to work.

TolikTipaTut1
Posts: 8
Joined: Mon Oct 07, 2019 10:44 am

Re: Can`t open a form in another thread.

Post by TolikTipaTut1 »

Thank you very much!

Actually, I`ve got some kind of "homework".
The task is:
I need to get the shortest car route. So, I need 3 threads:
GUI for users to interact with, the engine and some kind of "bridge" thread. Sorry for my english.

How can I create events in powershell ?
For example:
A user presses a button on form (calculate route)
Then I need to sart the calculation process. I know that i can use "button.Add_Click({<# code here #>})", but I need to create threads instead...

jvierra
Posts: 14335
Joined: Tue May 22, 2007 9:57 am
Contact:

Re: Can`t open a form in another thread.

Post by jvierra »

I cannot even begin to guess what you are trying to do.

PowerShell is not multithreaded, You can use jobs to do calculations in the background.
If you are not an experienced programmer or an experienced PowerShell coder then I suggest not doing this in a form.

Why is this "homework"? What are you studying that requires using PowerShell?

TolikTipaTut1
Posts: 8
Joined: Mon Oct 07, 2019 10:44 am

Re: Can`t open a form in another thread.

Post by TolikTipaTut1 »

I am a university of geodesy and cartography student.
Our lecturer gave us this homework.
I insisted on using С# perform this task ...

jvierra
Posts: 14335
Joined: Tue May 22, 2007 9:57 am
Contact:

Re: Can`t open a form in another thread.

Post by jvierra »

Did your professor require threads? PowerShell does not do threads. Runspaces are much more complex and do not do forms well unless you are a vvery experienced programmer with Windows forms.

I cannot believe a professor of "mapping" would require PowerShell. It is not an application development language. It is an automation language for admins and developers to use to built tools for diagnostics and reporting. Applications requires a different system. C# is an applications development language and more.

Also you do not need to use threads to do any simple calculations. You can just executer good mathematical formulas that are design to solve issues like the "salesmeans' route problem".

Just add the code to an event on a button and click the button.

On modern processors the shortest route algorithms for routes with fewer that 50 segments can execute in a second or two. I see no need for threads.

TolikTipaTut1
Posts: 8
Joined: Mon Oct 07, 2019 10:44 am

Re: Can`t open a form in another thread.

Post by TolikTipaTut1 »

Yes, our professor didn't tell me that threads are required.
So, I'll paste code into button.add_click)

P.S. But I'll continue to understand runspaces, because it's really interesting)
Thank you very much for your help!

Locked