库没有单独的「重试」命令:置超时 + 看状态码/取错误(),失败再请求即可。
不要在按钮单击里 延时 空转——会卡住窗口。后台拉、完成事件再改控件(同 线程回 UI)。
窗口需有:按钮拉取、标签1。把 g_url 换成你的接口。
文本 g_url = "https://httpbin.org/get"
文本 g_结果
文本 g_错误
整数 g_池 = 0
逻辑 g_忙碌 = 假
函数 可重试 (整数 码) 逻辑 {
如果 (码 == 0) {
返回 (真) // 超时、连不上
}
如果 (码 >= 500 && 码 <= 599) {
返回 (真)
}
返回 (假)
}
函数 后台拉 (整数 dummy) {
HTTP类 http
http.置超时(8000)
g_结果 = ""
g_错误 = ""
整数 i
循环 (3, i) {
文本 回 = http.提交("GET", g_url)
整数 码 = http.取状态码()
如果 (码 >= 200 && 码 < 300) {
g_结果 = 回
g_错误 = ""
返回 ()
}
g_错误 = http.取错误()
如果 (g_错误 == "") {
g_错误 = "状态码 " + 到文本(码)
}
如果 (可重试(码) == 假) {
返回 () // 4xx 等不要连打
}
如果 (i < 2) {
延时(400 * (i + 1))
}
}
}
函数 拉完 (整数 序号) {
g_忙碌 = 假
按钮拉取.启用 = 真
如果 (g_错误 == "") {
标签1.标题 = "成功,长度 " + 到文本(取文本长度(g_结果))
} 否则 {
标签1.标题 = "失败:" + g_错误
}
如果 (g_池 != 0) {
关闭线程池(g_池)
g_池 = 0
}
}
函数 按钮拉取.单击 (整数 X, 整数 Y) {
如果 (g_忙碌) {
返回 ()
}
g_忙碌 = 真
按钮拉取.启用 = 假
标签1.标题 = "请求中…"
g_池 = 创建线程池(1)
如果 (g_池 == 0) {
g_忙碌 = 假
按钮拉取.启用 = 真
标签1.标题 = "创建线程池失败"
返回 ()
}
置线程池完成事件(g_池, &拉完)
投递任务(g_池, &后台拉, 0)
}
函数 主窗口.创建完毕 () {
标签1.标题 = "点「拉取」:超时 8 秒,最多 3 次"
}
| 错误 | 正确 |
|---|---|
按钮里 循环 + 延时 重试 |
放到工作线程;拉完 里改标签 |
| 400/401 也重试 | 只重试超时(状态码 0)和 5xx |
不看 取状态码() |
空文本可能是超时,也可能是 204 |
启用自动Cookie(真) 后,重试仍用同一 HTTP类 会话,登录态会带着。对照:http.md · thread-support.md