C#の疑問がいっぱい
C#の疑問がいっぱい
C#を組んでいて分からないことがいっぱいあるので教えて下さい。
①これは、都合上の問題なんですが、コマンドプロンプトが実行時すぐ閉じてしまいますよね?これを閉じないようにする方法を教えて下さい。
for(i=1; i<=1000000 i++){}を行の最後に入れるみたいな力業はなしでお願いします。待機してるみたいな感じのコードを追加できませんか?
②MemoryStreamの使い方、用途が分かりません。
テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?
③MemoryStreamの閉じ方を教えて下さい。これってDisposeしなきゃダメですよね?
MemoryStream ms;
を使うとmsのDIsposeっていつすればいいんですか?
環境ですが
Visual C# 2010 Expressです。
①これは、都合上の問題なんですが、コマンドプロンプトが実行時すぐ閉じてしまいますよね?これを閉じないようにする方法を教えて下さい。
for(i=1; i<=1000000 i++){}を行の最後に入れるみたいな力業はなしでお願いします。待機してるみたいな感じのコードを追加できませんか?
②MemoryStreamの使い方、用途が分かりません。
テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?
③MemoryStreamの閉じ方を教えて下さい。これってDisposeしなきゃダメですよね?
MemoryStream ms;
を使うとmsのDIsposeっていつすればいいんですか?
環境ですが
Visual C# 2010 Expressです。
Re: C#の疑問がいっぱい
① Console.ReadKey();コードを追加。
② MSDNのSample---いまVS2008で確認した。
・MemoryStreamの使い方:MSDNのSample
・用途:バッキング ストアとしてメモリを使用する
③ usingステートメントを使えば「Disposeメソッド」が呼び出されることを保障します。
「MSDN の Sample 通り
・”誰から””どんな時”に聞きましたか?(Time(時間)、Place(場所)、Occasion(場合)を詳しく。
「テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?」
---
私はPowerShell_iseを愛用してるから①の問題は起きない。
② MSDNのSample---いまVS2008で確認した。
・MemoryStreamの使い方:MSDNのSample
・用途:バッキング ストアとしてメモリを使用する
using System;
using System.IO;
using System.Text;
class MemStream
{
static void Main()
{
int count;
byte[] byteArray;
char[] charArray;
UnicodeEncoding uniEncoding = new UnicodeEncoding();
// Create the data to write to the stream.
byte[] firstString = uniEncoding.GetBytes(
"Invalid file path characters are: ");
byte[] secondString = uniEncoding.GetBytes(
Path.GetInvalidPathChars());
using (MemoryStream memStream = new MemoryStream(100))
{
// Write the first string to the stream.
memStream.Write(firstString, 0, firstString.Length);
// Write the second string to the stream, byte by byte.
count = 0;
while (count < secondString.Length)
{
memStream.WriteByte(secondString[count++]);
}
// Write the stream properties to the console.
Console.WriteLine(
"Capacity = {0}, Length = {1}, Position = {2}\n",
memStream.Capacity.ToString(),
memStream.Length.ToString(),
memStream.Position.ToString());
// Set the position to the beginning of the stream.
memStream.Seek(0, SeekOrigin.Begin);
// Read the first 20 bytes from the stream.
byteArray = new byte[memStream.Length];
count = memStream.Read(byteArray, 0, 20);
// Read the remaining bytes, byte by byte.
while (count < memStream.Length)
{
byteArray[count++] =
Convert.ToByte(memStream.ReadByte());
}
// Decode the byte array into a char array
// and write it to the console.
charArray = new char[uniEncoding.GetCharCount(
byteArray, 0, count)];
uniEncoding.GetDecoder().GetChars(
byteArray, 0, count, charArray, 0);
Console.WriteLine(charArray);
}
}
}
「MSDN の Sample 通り
・”誰から””どんな時”に聞きましたか?(Time(時間)、Place(場所)、Occasion(場合)を詳しく。
「テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?」
---
私はPowerShell_iseを愛用してるから①の問題は起きない。
Re: C#の疑問がいっぱい
ちゃん太 さんが書きました:①これは、都合上の問題なんですが、コマンドプロンプトが実行時すぐ閉じてしまいますよね?これを閉じないようにする方法を教えて下さい。
for(i=1; i<=1000000 i++){}を行の最後に入れるみたいな力業はなしでお願いします。待機してるみたいな感じのコードを追加できませんか?
- リリース版での話であれば,コマンドプロンプトを起動して実行することで結果が残ります。
エクスプローラーからの起動で終了するのは,上記を優先した結果の仕様としか言い様がないです。 - デバッグ版をVisual Studioから起動した場合の話であれば,metaphorさんの書かれているようなConsoleの読み込み系のコードを追加しておくか,Mainメソッドの末尾にブレークポイントを仕込むことで対処ができます。
入出力がStreamでしかできないAPIに,メモリで構築したものを使う,などの利用方法があります。ちゃん太 さんが書きました:②MemoryStreamの使い方、用途が分かりません。
テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?
データのデシリアライズ用途であれば,Streamは読み込む時間だけ保持すればよいため,FileStreamを直接渡しても問題ないですが,
Streamを保持したまま長い時間処理するような場合は,MemoryStreamにコピーする事でファイルやネットワークなどを解放することができます。
実際問題としては,こういうものがあると知っていることが重要で,使い方がわからないのは現時点では不要だからかと思います。
MemoryStreamに限って書くなら,呼び出し不要です。ちゃん太 さんが書きました:③MemoryStreamの閉じ方を教えて下さい。これってDisposeしなきゃダメですよね?
MemoryStream ms;
を使うとmsのDIsposeっていつすればいいんですか?
MemoryStreamは内部にbyteの配列を持ったStreamなので,CLRが面倒を見ないリソースを抱えていません。
このため,Disposeを呼び出さなくてもリソースのリークは発生しません。
ただし,MemoryStreamクラスのベースクラスであるStreamクラスはファイナライザ (C#的にはデストラクタ) を実装しています。
この影響で,MemoryStreamはGCが2段階で行われます。
CloseメソッドまたはDisposeメソッドを呼ぶと,ファイナライザの呼び出しが抑制されるため,GCが1回で済むようになります。
GCの呼び出しを最低限に抑えたいならば,CloseまたはDisposeメソッドを呼び出すとよいでしょう。
オフトピック
IDisposableでDisposeを呼び出す必要があるのかを毎回確認するのは面倒なので常にusingに入れる,等の考え方も当然あり得ます (実は私はこちら派)。
なお,Disposeの呼び出しは, の順で呼ばれ,CloseでDispose(true)した後にファイナライザの呼び出しが抑制されます。
なお,Disposeの呼び出しは, の順で呼ばれ,CloseでDispose(true)した後にファイナライザの呼び出しが抑制されます。
Re: C#の疑問がいっぱい
>いきなり膨大な量のコード書かれても理解できません
>すいません、ここで聞くより初心者サイトから勉強したほうがいいですか…
すいません。質問が高度な内容に見えたから解ると思ってました。一度フォーラムルールをお読み下さいますようお願い申し上げます。http://dixq.net/board/board.html
[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか
[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
のように記述下さい。Step by Step で進めましょう。
>すいません、ここで聞くより初心者サイトから勉強したほうがいいですか…
すいません。質問が高度な内容に見えたから解ると思ってました。一度フォーラムルールをお読み下さいますようお願い申し上げます。http://dixq.net/board/board.html
[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか
[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
のように記述下さい。Step by Step で進めましょう。
Re: C#の疑問がいっぱい
metaphorさんありがとうございます。
本当にC#の文法しか知らない初心者です。
したいことは以下です。
memorystreamにbitmap画像を代入、画像のRBG値を見たい。
本当に分かりやすいように、画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を読み込んで
値を取得したいです。
順番
①Bitmapで配列を読み込み
②memorystreamに画像データ挿入
③memorystreamのデータを取得する(4つのRGB値)
④Dataobjectにmemorystreamからデータを取得 ちなみにDataobject型なのかIODataobject型にするかどっちか分からない。
⑤Dataobjectのデータを取得(4つのRGB値)
したいことは以上となります。
私が持ってる参考書はC#の文法しか書いておらず、memorystreamやdataobjectなど画像関係の関数は全く掲載されていませんでした。
10行くらいの簡単なコードでご教授くださいませんか?
本当にC#の文法しか知らない初心者です。
したいことは以下です。
memorystreamにbitmap画像を代入、画像のRBG値を見たい。
本当に分かりやすいように、画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を読み込んで
値を取得したいです。
順番
①Bitmapで配列を読み込み
②memorystreamに画像データ挿入
③memorystreamのデータを取得する(4つのRGB値)
④Dataobjectにmemorystreamからデータを取得 ちなみにDataobject型なのかIODataobject型にするかどっちか分からない。
⑤Dataobjectのデータを取得(4つのRGB値)
したいことは以上となります。
私が持ってる参考書はC#の文法しか書いておらず、memorystreamやdataobjectなど画像関係の関数は全く掲載されていませんでした。
10行くらいの簡単なコードでご教授くださいませんか?
Re: C#の疑問がいっぱい
OS : windows10
環境 :Visual C#
テンプレート: Windowsコンソールアプリケーション
です。
YuOさん
>入出力がStreamでしかできないAPIに,メモリで構築したものを使う,などの利用方法があります。
>データのデシリアライズ用途であれば,Streamは読み込む時間だけ保持すればよいため,FileStreamを直接渡しても問題ないですが,
>Streamを保持したまま長い時間処理するような場合は,MemoryStreamにコピーする事でファイルやネットワークなどを解放することができます。
この文章があまりにも難しくて僕には理解できないのですが…
・入出力がStreamでしかできないAPIってDataobjectの事ですか?
・FileStreamからデータを読み込んだ場合、そのファイルを操作するのは不可能ってことですか?
環境 :Visual C#
テンプレート: Windowsコンソールアプリケーション
です。
YuOさん
>入出力がStreamでしかできないAPIに,メモリで構築したものを使う,などの利用方法があります。
>データのデシリアライズ用途であれば,Streamは読み込む時間だけ保持すればよいため,FileStreamを直接渡しても問題ないですが,
>Streamを保持したまま長い時間処理するような場合は,MemoryStreamにコピーする事でファイルやネットワークなどを解放することができます。
この文章があまりにも難しくて僕には理解できないのですが…
・入出力がStreamでしかできないAPIってDataobjectの事ですか?
・FileStreamからデータを読み込んだ場合、そのファイルを操作するのは不可能ってことですか?
Re: C#の疑問がいっぱい
了解しました。いまマシンを他の事で使っているので空いたら作ってみます。
[確認]
①Bitmapデータを配列に読み込み
②memorystreamに画像データ挿入
③memorystreamのデータを取得する(4つのRGB値)
④Dataobjectにmemorystreamからデータを取得 ちなみにDataobject型なのかIODataobject型にするかどっちか分からない。
⑤Dataobjectのデータを取得(4つのRGB値)
[確認]
①Bitmapデータを配列に読み込み
②memorystreamに画像データ挿入
③memorystreamのデータを取得する(4つのRGB値)
④Dataobjectにmemorystreamからデータを取得 ちなみにDataobject型なのかIODataobject型にするかどっちか分からない。
⑤Dataobjectのデータを取得(4つのRGB値)
Re: C#の疑問がいっぱい
いいえ。ちゃん太 さんが書きました:・入出力がStreamでしかできないAPIってDataobjectの事ですか?
世の中にはバイナリデータを処理する場合に,引数としてbyte[]やIEnumerable<byte>などを受け付けず,Streamしか引数としてとらないAPIが存在します。
別途得られたbyte[]データをそのようなAPIに渡す時などに,MemoryStreamでラップします。
e.g.) XmlReader.Create メソッド
オフトピック
そもそも,Dataobjectというクラス・メソッド・プロパティ等は.NET Frameworkクラスライブラリには存在しません。
System.Windows.FormsにDataObjectという,Oが大文字のクラスなら存在しますが,C#は大文字と小文字を区別する言語ですから別物なのでしょう。
System.Windows.FormsにDataObjectという,Oが大文字のクラスなら存在しますが,C#は大文字と小文字を区別する言語ですから別物なのでしょう。
操作,というか入出力は,むしろFileStreamで行います。ちゃん太 さんが書きました:・FileStreamからデータを読み込んだ場合、そのファイルを操作するのは不可能ってことですか?
ただし,FileStreamが開いている間,他のプロセスはそのファイルに対してのアクセスが禁止されたり,書き込みできなかったり,といった状況になります。
そもそも,やりたいことは何ですか。
とは書いていますが,それは本当にやりたいことですか。ちゃん太 さんが書きました:memorystreamにbitmap画像を代入、画像のRBG値を見たい。
本当に分かりやすいように、画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を読み込んで
値を取得したいです。
画像の各ピクセルのR/G/Bの値を取得したいのが本来のやりたいことで,MemoryStreamはやりたいこと自体とは関係しないのではないでしょうか。
Re: C#の疑問がいっぱい
画像加工のプログラミングがしたいのです。
そのためにRGB値を取得したいです。
それに関連するクラスとか全部マスターしたいのです。
memorystream以外にもわからないことが今日出てきました。
Bitmap.LockBits メソッドですが使い方が分かりません。
どうやらgetpixelの上位互換らしいですが。
直接memorystreamが画像と関係するか分かりませんが、参考にするコードでmemorstreamが出てくる事が多いので気になりました。
疑問がいっぱいありますがお答えいただけると嬉しいです。
最終的にしたいことは、お絵かきソフトの作成なんで、それはさすがに現状あまりにも無理があるので基本的なことからつぶしていきたいのです。
そのためにRGB値を取得したいです。
それに関連するクラスとか全部マスターしたいのです。
memorystream以外にもわからないことが今日出てきました。
Bitmap.LockBits メソッドですが使い方が分かりません。
どうやらgetpixelの上位互換らしいですが。
直接memorystreamが画像と関係するか分かりませんが、参考にするコードでmemorstreamが出てくる事が多いので気になりました。
疑問がいっぱいありますがお答えいただけると嬉しいです。
最終的にしたいことは、お絵かきソフトの作成なんで、それはさすがに現状あまりにも無理があるので基本的なことからつぶしていきたいのです。
Re: C#の疑問がいっぱい
関連するクラスを全部マスターしたいというのは無茶ではないですか?ちゃん太 さんが書きました:それに関連するクラスとか全部マスターしたいのです。
のちのち「関連するクラス」を全部マスターする!という野望を持つにしても、とりあえず作りたいプログラムに必要、もしくは使うとよさそうなAPIだけを調べながらプログラムを完成させることを目標にした方がよくないですか?
もちろん、プログラムを書くのは目的ではなく手段でありできなくてもいい、とにかく「関連するクラス」を全部マスターしたいんだ!というのなら、おすすめはしませんが否定もしません。勝手にどうぞ。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C#の疑問がいっぱい
metaphorさんご親切にありがとうございます。
Bitmapの読み込みは
Bitmap img = new Bitmap(filepath);で超簡単なので出来ます。
そこから何をしていいやら…
Bitmapの読み込みは
Bitmap img = new Bitmap(filepath);で超簡単なので出来ます。
そこから何をしていいやら…
Re: C#の疑問がいっぱい
学校は専門です。
Photoshopみたいなソフトが作りたくて勉強中です。
metaphorさん、逆に課題を頂けませんか?
以降のコードはgetpixelなどありきありなコードしかありません。
Photoshopみたいなソフトが作りたくて勉強中です。
metaphorさん、逆に課題を頂けませんか?
以降のコードはgetpixelなどありきありなコードしかありません。
Re: C#の疑問がいっぱい
それでいいですよ。まずクラスが用意できるかたいだけです、配列の宣言はしてあますか?
>画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を
は間違いでAlpha,R,G,Bです。
(投稿がふえると2頁になるので気をつけて下さい)
>画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を
は間違いでAlpha,R,G,Bです。
(投稿がふえると2頁になるので気をつけて下さい)
Re: C#の疑問がいっぱい
Bitmap img;
ですよね?
getpixelで取得するのは遅いということで、早い方法がbitmaplockらしいですが
それらしいコードが見つかりません。
ですよね?
getpixelで取得するのは遅いということで、早い方法がbitmaplockらしいですが
それらしいコードが見つかりません。
Re: C#の疑問がいっぱい
端くれプログラマの備忘録っていうサイトの
参考ページのですが
Bitmap bitmap = new Bitmap("C:\\Temp\\lena.jpg");
BitmapData data = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format32bppArgb);
byte[] buf = new byte[bitmap.Width * bitmap.Height * 4];
Marshal.Copy(data.Scan0, buf, 0, buf.Length);
for (int i = 0; i < buf.Length; )
{
byte grey = (byte)(0.299 * buf + 0.587 * buf[i+1] + 0.114 * buf[i+2]);
buf[i++] = grey;
buf[i++] = grey;
buf[i++] = grey;
i++;
}
Marshal.Copy(buf, 0, data.Scan0, buf.Length);
bitmap.UnlockBits(data);
参考ページのですが
Bitmap bitmap = new Bitmap("C:\\Temp\\lena.jpg");
BitmapData data = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format32bppArgb);
byte[] buf = new byte[bitmap.Width * bitmap.Height * 4];
Marshal.Copy(data.Scan0, buf, 0, buf.Length);
for (int i = 0; i < buf.Length; )
{
byte grey = (byte)(0.299 * buf + 0.587 * buf[i+1] + 0.114 * buf[i+2]);
buf[i++] = grey;
buf[i++] = grey;
buf[i++] = grey;
i++;
}
Marshal.Copy(buf, 0, data.Scan0, buf.Length);
bitmap.UnlockBits(data);
Re: C#の疑問がいっぱい
VisualStudioを使っているならこう言う説明を見なくても自動補完してくれるはず。(私はPowerShellを使うけどVisualStudioより便利です)
Re: C#の疑問がいっぱい
>C#を組んでいて分からないことがいっぱいあるので教えて下さい。
C#の勉強はC/C++みたいにメモリー管理しなくていいからすぐ覚えて使えるはず。VisualStudioの使い方は友達に聞くかひとのやってるのをみて覚えないと自分だけでは難しいですよ。さっきのサンプルは全然まとはずれです。
C#の勉強はC/C++みたいにメモリー管理しなくていいからすぐ覚えて使えるはず。VisualStudioの使い方は友達に聞くかひとのやってるのをみて覚えないと自分だけでは難しいですよ。さっきのサンプルは全然まとはずれです。
Re: C#の疑問がいっぱい
Bitmap img;からAlpha,R,G,Bに変換したいならどのクラスが必要かわかるでしょう。(Alpha,R,G,Bを間違えるのはVisualStudioを使えるならありえいから説明しょうと思うのですが)
Re: C#の疑問がいっぱい
Timer t = new Timer(); たったこの一行で
エラー 1 'System.Threading.Timer' に、引数を 0 個指定できるコンストラクターがありません。
が出てきました。何故でしょう?
エラー 1 'System.Threading.Timer' に、引数を 0 個指定できるコンストラクターがありません。
が出てきました。何故でしょう?
Re: C#の疑問がいっぱい
TimerクラスってC#2つありますよね?
どっち使ったらいいですか?
トピックと直接は関係ないんですが、すいません。
1秒ごとに色が変わるプログラムを作ろうと思って…
どっち使ったらいいですか?
トピックと直接は関係ないんですが、すいません。
1秒ごとに色が変わるプログラムを作ろうと思って…
Re: C#の疑問がいっぱい
まずここhttp://www.atmarkit.co.jp/fdotnet/dotne ... timer.htmlを読んで分からない事があったら聞いてくださいね。
Re: C#の疑問がいっぱい
http://csi.nisinippon.com/pngサンプル
System.Windows.Forms System.Drawing の参照設定のこと
System.Windows.Forms System.Drawing の参照設定のこと
using System;using System.Windows.Forms;
using System.Drawing;
namespace ConsoleApplication1
{
class Program{
[STAThread]
static void Main(string[] args){
Form f; f = new Form(); f.Show(); f.BackColor = Color.Red;
while (f.Created)//Application::Runしないでループ
{
f.BackColor = Color.Red;//赤色
System.Windows.Forms.Application.DoEvents();
System.Threading.Thread.Sleep(500);//一秒間(1000ミリ秒)停止する
f.BackColor = Color.Cyan;//シアン色
System.Windows.Forms.Application.DoEvents();
System.Threading.Thread.Sleep(500);//一秒間(1000ミリ秒)停止する
System.Windows.Forms.Application.DoEvents();
}}}}
Re: C#の疑問がいっぱい
http://csi.nisinippon.com/smp.png
訂正版: VisualStudio2008で動作確認済み
PowerShellで作った。VisualStudio しか知らないプログラマーには出来ないかも知れません。
訂正版: VisualStudio2008で動作確認済み
PowerShellで作った。VisualStudio しか知らないプログラマーには出来ないかも知れません。
Re: C#の疑問がいっぱい
書いてあるとおり,System.Threading.Timerクラスのコンストラクタには,引数が0個のものがないからです。ちゃん太 さんが書きました:Timer t = new Timer(); たったこの一行で
エラー 1 'System.Threading.Timer' に、引数を 0 個指定できるコンストラクターがありません。
が出てきました。何故でしょう?
少なくとも,時間が経った時に呼ばれるコールバックデリゲートが引数として必要です。
Timerクラスは2つではないです……。ちゃん太 さんが書きました:TimerクラスってC#2つありますよね?
どっち使ったらいいですか?
とりあえずですが,基本的には
- WinFormsであれば,System.Windows.Forms.Timer
- WPFであればSystem.Windows.Threading.DispatcherTimer
UIと関係なくタイマーを使いたい場合は,System.Threading.Timerを使います。
オフトピック
実際問題として、System.Timers.Timerを使うかSystem.Threading.Timerを使うかは意見がわかれるところだと思います。
検索すると,両方とも推奨するページがみつかります。
ただし,どちらもUIに貼って簡単に使うようなものではないので,Forms.TimerやDispatcherTimerに慣れた方がよいでしょう。
検索すると,両方とも推奨するページがみつかります。
ただし,どちらもUIに貼って簡単に使うようなものではないので,Forms.TimerやDispatcherTimerに慣れた方がよいでしょう。
WinFormsならば,まずはSystem.Windows.Forms.TimerをFormに貼り,Tickイベントのハンドラに色を変更するようなコードを書きます。ちゃん太 さんが書きました:トピックと直接は関係ないんですが、すいません。
1秒ごとに色が変わるプログラムを作ろうと思って…
さらに,貼ったTimerのIntervalプロパティを1000に(Intervalは単位がミリ秒のため),Enabledプロパティをtrueに設定します。
とりあえず,Application.DoEventsなんてものを使っている時点で論外です。Math さんが書きました:http://csi.nisinippon.com/pngサンプル
UIスレッドでThread.Sleepというのは,やってはいけない基本中の基本ですし。
間違っても,Mathさんのコードを参考にしないようにお願いします。
一定時間ごとに物事を行いたい場合,Timerを使うか,マルチスレッドを使って処理します。
おそらく,動作させた場合,ウィンドウを移動させようとしても最大500ms反応しませんし,逆に動かしている最中は色が変化しないはずです。
「Visaul Studioしか知らないプログラマーでは出来ない」のではなく,知識がある人は地雷だらけのそのようなコードを書かないだけです。Math さんが書きました:PowerShellで作った。VisualStudio しか知らないプログラマーには出来ないかも知れません。
- UIスレッドで長時間処理をすると,ウィンドウメッセージの処理が滞りUIの反応が悪くなるため,長時間処理は行わない。別スレッドに任せるのが普通。
Thread.SleepやTask.Delayは長時間処理の典型例であり,当然使わない。 - Application.DoEventsを使うと,想定外のタイミングで処理が行われるため動作の管理がややこしくなる上,そもそもUIスレッドで処理をしないことで対処ができるので,使わないのが普通。
Re: C#の疑問がいっぱい
そうですよね。今時DoEventsは使わないと思います。過去に見た引用先サイトの例を写して急いで作ったもので質問された方への説明ようです。あとデルタ式でボタンの説明まで作ってあったのですが。その方も例を見れば勘違いしていることに気付かれると思ったのですがやはりどうか...。PwerShellの件は初心者の方のことで”VisualStudioがあまりに便利(どちらかというとそこまでしなくても...と思うので)なのでPowerShellでコマンドでコンパイルする方が勉強になるののではないでしょうかという意味です。それにPowerShellはUnixのShell互換なのでその意味でもおすすめです。