์๋
ํ์ธ์. ํ์ฌ ์ ๋ C# .net์ ์ด์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์ ์ ์ค์
๋๋ค.
๋ค๋ฆ์ด ์๋๋ผ Invoke๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ๋ฉ์ถค ํ์์ด ์ผ์ด๋ ์ด๋ค ์์ธ์ธ ์ง ๊ถ๊ธํด์ ๊ธ์ ์๋๋ค.
๋จผ์ ๋ฌธ์ ๊ฐ ๋๋ ๊ตฌ์กฐ์ ๋ํด ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
์นด๋ฉ๋ผ๋ฅผ ์ธ์ํ๋ Thread์์ ์นด๋ฉ๋ผ ๋ผ์ด๋ธ ๊ฐ์ฒด๋ฅผ ์ ์ ํ UI Control์ ์ถ๊ฐํ๋ ๊ตฌ์กฐ์
๋๋ค.
์ฌ๊ธฐ์ UI Control์ ์ถ๊ฐํ๋ ๋ถ๋ถ์ด UI Thread๊ฐ ์๋ ์นด๋ฉ๋ผ ์ธ์ํ๋ Thread์์ ์ถ๊ฐํ๊ธฐ ํธ์ถ ๋๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
ํ์ง๋ง Invoke ์ค์ด ์คํ ๋ ํ AddCameraView ํจ์๊ฐ ํธ์ถ ๋์ง ์๋ค์.
ํน์ ํธ์ถ ๋์ง ์๋ ์ด์ ๋ฅผ ์์๋ ๋ถ ๊ผญ ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค.
public void OnCameraAddEvent(object sender, CameraAddArgs e)
{
Console.WriteLine("ํ์ฌ Thread : {0}", Thread.CurrentThread.ManagedThreadId);
if (this.camScrollView.InvokeRequired)
this.camScrollView.Invoke(new Action(delegate () { AddCameraView(e.cameraView, e.cameraName); }));
else
AddCameraView(e.cameraView, e.cameraName);
}
1 Like
์ฌํ๋๋ ํ๋ก์ ํธ๋ฅผ ๊ฐ์ด ์ฒจ๋ถํด ์ฃผ์๊ฒ ์ด์?
1 Like
ํ์ฌ ํ๋ก์ ํธ๋ผ ์ฝ๋ ์์ฒด๋ฅผ ์ฒจ๋ถํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๋ด์ฉ์ผ๋ก ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
private void AddCameraView(CaptureCameraView view)
{
Console.WriteLine("D");
this.cameraViews.Add(view);
this.camScrollView.Controls.Add(view);
CameraController.Instance.setTriggerMode(view.Index, false);
CameraController.Instance.Grab(view.Index);
}
์ดํด๊ฐ ์๋๋ ๋ถ๋ถ์ด ์์ผ์๋ฉด ๋ฐ๋ก๋ฐ๋ก ๋ต ๋๋ฆฌ๊ฒ ์ต๋๋ค.!
1 Like
UI Thread๋ฅผ ๊ฝ์ก๊ณ ์๋ ๋ถ๋ถ์ด ์์ด์ Invoke๋ฅผ ํ์ ๋ ๋จนํต์ด ๋๋๊ฒ ์๋๊ฐ ์ถ๋ค์.
1 Like
ํน์ ๊ฝ ์ก๋๋ค๋ ์์ ์ ์ ์์ ๊น์โฆ? ์์ง ๋ฌด์จ ์๋ฏธ์ธ ์ง ๋ชจ๋ฅด๊ฒ ๋ค์.
1 Like
์ฌํ ํ๋ก์ ํธ๋ผ ํ์ฌ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๋ถ๋ถ์ ๋ํด์ ๋ฑ ์ํ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ ์ฌ๋ ค๋ฌ๋ผ๊ณ ํ์ ์๋ฏธ์ด์ค๊ฒ๋๋ค.
์ ๋ํ
์คํธ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ค๋ฉด ๋ฑ ๋ชจ๋๊ณผ ์ ๋ํ
์คํธ๋ง ๋ผ์ ์ฌ๋ฆด ์ ์๊ฒ ์ง๋ง ๋ง์ ํ์ฌ๋ค์ด ๊ทธ๋ ์ง ๋ชปํ ๊ฑฐ๊ตฌ์.
๊ทธ๋์ ํ๋ก์ ํธ์์ ๋ฌธ์ ๊ฐ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ค๋ฅธ ๊ฑฐ ๋ค ์ ์ธํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ ๋์ ์ํ ํ๋ก์ ํธ๋ฅผ ์ค์ค๋ก ๋ง๋ค์ด ๋ณด๋ ๊ฒ๋๋ค.
์ฌํ ํ๋ก์ ํธ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์๋ค๋ฉด, ๋ค๋ฅธ ๊ฒ์ด ์์ธ์ด๋ค ๋ผ๋ ๊ฒ์ ์ค์ค๋ก ํ์
ํ ์ ์๊ณ , ์๋๋ฉด ๋ด๊ฐ ์ํ ํ๋ก์ ํธ๋ฅผ ์๋ชป ๋ง๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค.
๋ค๋ง ๊ทธ๊ฒ์ ์ฝ๋๋ก ๋ณด์ฌ์ ธ์ผ ์ ์ ์์ฃ .
์ง๋ฌธ์ ๋๊ป์ ์ ์ฑ๋ค์ฌ์ ์ํํ๋ก์ ํธ์ ์ง๋ฌธ์ ๋ํ
์ผํ๊ฒ ํ์ค ์๋ก ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ต๋ณ์๊ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ DevExpress ๊ฐ์ํ์ฌ์์๋ ์ฝ๋์ ๊ดํ ์ง๋ฌธ์ ์ฌ๋ฆด ๋๋ ์ํํ๋ก์ ํธ๋ฅผ ์ฒจ๋ถํ๋ผ๊ณ ๊ถ์ฅํ๋ ๊ฒ์
๋๋ค.
์ฒ์์ด๋ผ ๋๋ฌด ์ด๋ ต๊ณ , ๊ท์ฐฎ์ ์ ์์ง๋ง ๋ณธ์ธ์ ์๊ฐ์ ์ต๋๋ก ํฌ์ํด์ ๋ต๋ณํด์ฃผ์๋ ๋ถ์ ์๊ฐ์ ์ต์ํ ํ๊ณ ํํํ์์ผ๋ก ์ค๋ ๋ ์ดํด์๋ฅผ ์ค์ผ ์ ์๋ ๊ฐ์ฅ ์ข์ ์๋จ์ ์ํ ์ฝ๋์
๋๋ค.
๊ทธ๋ ๊ฒ ์ํ ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ์ต๊ด์ ๋ฌธ์ ์ ๋ํด ๊ตฌ์ฒดํ ํ๋ ํ๋ จ๋ ๋๋๊ฑฐ๋ผ์ ํ๋ฒ ๋ง๋ค์ด๋ณด์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
3 Likes
์๋ง๋ OnCameraAddEvent ๋ฉ์๋๋ช
์ผ๋ก ๋ฏธ๋ฃจ์ด ๋ด์
์ํ์์ค๋ฅผ ์ฌ๋ฆฌ์
๋ camera๊ฐ ์์ผ๋ฉด ํ๋์ค๊ฒ๊ฐ๋ค์
(web cam ์ด๋ผ๋ฉด ์ ๋ฐ๋ฌธ์ ๊ฐ ์๊ธฐ์ง๋ ์๊ฒ ์ง์)
Dispacher ๊ด๋ จ์ผ๋ก ๋ค์ํ ๊ฒ์์ ํตํด์ ์ด๊ฒ์ ๊ฒ ์ ์ฉํด๋ณด์๊ฑฐ๋
๊ทผ๋ฐ
Dispatcher.Invoke(DispatcherPriority.Normal
, new Action(
delegate
{
//์ฌ์ฉํ ๋ฉ์๋ ๋ฐ ๋์
MainUi.Children.Add(newIoUC);
}));
Current handler ์ก์์์ Priority ์ค์ ํ์ง ์๋์??
์์ค๋ง ๋ด์ ์๋ชจ๋ฅด๊ฒ ์ง๋ง scroll ๊ตฌ๋ฌธ๋ ๋ณด์ด๊ณ
ui thread๊ฐ ๋ต์ด ์๋๊ฒฝ์ฐ๊ฐ ๋ง์์ ํ๋จํ๊ธฐ ํ๋ญ๋๋ค.
1 Like
๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค.
ํ์ฌ DalsaCamera๋ฅผ ์ฌ์ฉํ์ฌ Camera ์์ฒด๋ Dalsa Library ๊ด๋ จ๋ ์ฝ๋์
๋๋ค.
camScrollView Control์ FlowLayoutPanel์
๋๋ค.
๊ฐ๋จํ๊ฒ ์๋์ ๊ตฌ์กฐ๋ฅผ ์ ์ด๋ณด์์ต๋๋ค.
์นด๋ฉ๋ผ ์ธ์ Thread
์ธ์ โ ์นด๋ฉ๋ผ ๊ฐ์ฒด ์์ฑ โ Control ์ถ๊ฐ
์ธ์ : ์นด๋ฉ๋ผ ์ฐ๊ฒฐ ๋ฐ ํด์ ์ธ์
์นด๋ฉ๋ผ ๊ฐ์ฒด ์์ฑ : ์นด๋ฉ๋ผ View Control ์์ฑ ๋ฐ ์นด๋ฉ๋ผ ์ ๋ณด
Control ์ถ๊ฐ : FlowLayoutPanel์ ์นด๋ฉ๋ผ View Control ์ถ๊ฐ
์นด๋ฉ๋ผ View Control
public class CameraView: PictureBox
{
private SapView sapView;
public CameraView() { }
protected override void OnPaint(PaintEventArgs e)
{
if (sapView != null && sapView.Initialized)
{
sapView.OnPaint();
}
base.OnPaint(e);
}
public SapView View
{
get { return this.sapView; }
set
{
this.sapView = value;
if (this.sapView != null)
{
this.sapView.Window = this;
}
}
}
public void UpdateViewSize(Size size)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<Size>(UpdateViewSize), size);
}
else
{
Initialized = true;
this.Size = size;
decimal WidthScalor = (decimal)(100.0f * this.Width / this.sapView.Buffer.Width);
decimal HeightScalor = (decimal)(100.0f * this.Height / this.sapView.Buffer.Height);
this.sapView.SetScalingMode((float)WidthScalor / 100.0f, (float)HeightScalor / 100.0f);
}
}
}
1 Like
์ ๋ต๋ณ ์ฝ๋ UpdateViewSize ํจ์์์ ๋ฉ์ถค ํ์์ด ์ผ์ด๋๋ค์.
this.Invoke(new Action<Size>(UpdateViewSize), size);
์ด ์ค์์ ๋ฉ์ถค ํ์์ด ์ผ์ด๋ฉ๋๋ค. ํ์ดํ์์ฃผ์์ท์ฐ๋ญ๋๊ฐ๋ ๊ฐ๋ฐ์๋ ์๊ฒฌ์ ํตํด ์๊ฐ ํด๋ณด์๋๋ฐ, ํด๋น PictureBox์ View๊ฐ ๊ณ์ UI Thread๋ฅผ ์ก์ ๋จน๊ณ ์๋ ๊ฒ ์๋ ๊น? ์๊ฐ์ด ๋๋ค์.
๋ค๋ฅธ ๋ถ๋ค ์๊ฐ๋ ๋ฃ๊ณ ์ถ์ต๋๋ค.!
3 Likes
์ฌ์ค ๊ทผ๋ณธ ์์ธ์ ์ฐพ๋๊ฒ ์ฐ์ ์ด๊ธดํ๋ฐ์โฆใ
ใ
Invoke๋ฅผ BeginInvoke๋ก ๋ฐ๊ฟ๋ณด์๊ฒ ์ด์?
Invoke๋ ๋ด ์ฐจ๋ก์์ ๋์ํ ๋๊น์ง ์กด๋ฒ!
BeginInvoke๋ ์ ๋ชจ๋ฅด๊ฒ ๊ณ ์ด๋ฐ๊ฐ ์ด๊ฑฐ ํ ์ ์์ผ๋ฉด ํด์ค. ๊ทธ๋ผ ๋๋ ์ด๋ง ๋น ์ผ!
ํ๋๊ฒ์
๋๋ค ใ
ใ
3 Likes
gensei
11
์๋
ํ์ธ์.
Image Grab Complete Event๋ฅผ Subscribe ๋ฐ์ UI์ ์ฌ๋ฆฌ๋ค๋ณด๋ฉด
Event๋ฅผ ์คํํ๋ Thread์ UI Thread์ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
๋ชจ๋ Event์ ํด๋นํ๋๊ฒ ์๋๋ผ Dalsa lib๋ก Grab์ ํ๊ฒ๋๋ฉด PC์ SDK๋ฅผ ํธ์ถํ์ฌ Grabํ๋ ํํ๋ค๋ณด๋ ๋ณ๊ฐ Thread๋ฅผ ํตํด Image๋ฅผ ๋ฐ์์ค์ญ๋๋ค.
์ด๋ด๋๋ Event๋ฅผ Subscribe ํ ๋ Current Thread๋ฅผ ๋ณ์๋ก ์ ์ฅํ์
จ๋ค Action์ ํ์ฐ์
์ผ์ผํฉ๋๋ค.
2 Likes